diff --git a/.gitignore b/.gitignore index 60d9092f91..6b84cb7df8 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ lib-cov .floo .flooignore builtAssets/ - +pm2.js *.env pids logs diff --git a/README.md b/README.md index 9770de3ebc..8e6742b074 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ + + [![Throughput Graph](https://graphs.waffle.io/freecodecamp/freecodecamp/throughput.svg)](https://waffle.io/freecodecamp/freecodecamp/metrics) -[![Stories in Ready](https://badge.waffle.io/FreeCodeCamp/freecodecamp.png?label=ready&title=Ready)](https://waffle.io/FreeCodeCamp/freecodecamp) - +[![Join the chat at https://gitter.im/freecodecamp/freecodecamp](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/freecodecamp/freecodecamp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) Welcome to Free Code Camp's open source codebase! ======================= @@ -17,7 +18,7 @@ Our campers (students) start by working through our free, self-paced, browser-ba 80% of our campers are over 25, and nearly a fifth of our campers are women. -This code is running live at [FreeCodeCamp.com](http://www.FreeCodeCamp.com). We also have [Slack](http://freecodecamp.slack.com), a [blog](http://blog.freecodecamp.com), and even a [Twitch.tv channel](http://twitch.tv/freecodecamp). +This code is running live at [FreeCodeCamp.com](http://www.FreeCodeCamp.com). We also have [Gitter](https://gitter.im/FreeCodeCamp/FreeCodeCamp), a [blog](http://blog.freecodecamp.com), and even a [Twitch.tv channel](http://twitch.tv/freecodecamp). [Join our community](http://www.freecodecamp.com/signin)! @@ -27,7 +28,7 @@ Contributing We welcome pull requests from Free Code Camp campers (our students) and seasoned JavaScript developers alike! Follow these steps to contribute: 1. Check our [public Waffle Board](https://waffle.io/freecodecamp/freecodecamp). -2. Pick an issue that nobody has claimed and start working on it. If your issue isn't on the board, open an issue. If you think you can fix it yourself, start working on it. Feel free to ask for help in our [Slack](http://freecodecamp.slack.com). +2. Pick an issue that nobody has claimed and start working on it. If your issue isn't on the board, open an issue. If you think you can fix it yourself, start working on it. Feel free to ask for help in our [Gitter](https://gitter.im/FreeCodeCamp/FreeCodeCamp) 3. Fork the project ([Need help with forking a project?](https://help.github.com/articles/fork-a-repo/)). You'll do all of your work on your forked copy. 4. Create a branch specific to the issue or feature you are working on. Push your work to that branch. ([Need help with branching?](https://github.com/Kunena/Kunena-Forum/wiki/Create-a-new-branch-with-git-and-manage-branches)) 5. Name the branch something like `user-xxx` where user is your username and xxx is the issue number you are addressing. diff --git a/common/models/User-Identity.json b/common/models/User-Identity.json index d63e5c0af3..79c2192f1c 100644 --- a/common/models/User-Identity.json +++ b/common/models/User-Identity.json @@ -11,6 +11,13 @@ "foreignKey": "userId" } }, - "acls": [], + "acls": [ + { + "accessType": "*", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "DENY" + } + ], "methods": [] } diff --git a/common/models/bonfire.json b/common/models/bonfire.json index ae5e5db32a..859f0196ed 100644 --- a/common/models/bonfire.json +++ b/common/models/bonfire.json @@ -36,7 +36,7 @@ { "accessType": "READ", "principalType": "ROLE", - "principalId": "$authenticated", + "principalId": "$everyone", "permission": "ALLOW" } ], diff --git a/common/models/challenge.json b/common/models/challenge.json index dfc8c9c4a9..f270e7f70b 100644 --- a/common/models/challenge.json +++ b/common/models/challenge.json @@ -72,7 +72,7 @@ { "accessType": "READ", "principalType": "ROLE", - "principalId": "$authenticated", + "principalId": "$everyone", "permission": "ALLOW" } ], diff --git a/common/models/comment.json b/common/models/comment.json index ada3b000d6..ec29a05c98 100644 --- a/common/models/comment.json +++ b/common/models/comment.json @@ -22,14 +22,15 @@ }, "rank": { "type": "number", - "default": "-Infinity" + "default": 0 }, "upvotes": { "type": "array", "default": [] }, "author": { - "type": {} + "type": {}, + "default": {} }, "comments": { "type": "array", @@ -49,6 +50,12 @@ "principalId": "$everyone", "permission": "DENY" }, + { + "accessType": "READ", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + }, { "accessType": "EXECUTE", "principalType": "ROLE", diff --git a/common/models/field-guide.json b/common/models/field-guide.json index b8e734247c..be3ae99a25 100644 --- a/common/models/field-guide.json +++ b/common/models/field-guide.json @@ -29,7 +29,7 @@ { "accessType": "READ", "principalType": "ROLE", - "principalId": "$authenticated", + "principalId": "$everyone", "permission": "ALLOW" } ], diff --git a/common/models/job.json b/common/models/job.json index 30f981d4df..83d50ebc7b 100644 --- a/common/models/job.json +++ b/common/models/job.json @@ -32,7 +32,7 @@ { "accessType": "READ", "principalType": "ROLE", - "principalId": "$authenticated", + "principalId": "$everyone", "permission": "ALLOW" } ], diff --git a/common/models/nonprofit.json b/common/models/nonprofit.json index 2cfad23d66..738c43e9ad 100644 --- a/common/models/nonprofit.json +++ b/common/models/nonprofit.json @@ -8,21 +8,12 @@ "type": "string", "unique": true }, - "requestedDeliverables": { - "type": "array" - }, "whatDoesNonprofitDo": { "type": "string" }, "websiteLink": { "type": "string" }, - "stakeholderName": { - "type": "string" - }, - "stakeholderEmail": { - "type": "string" - }, "endUser": { "type": "string" }, @@ -41,11 +32,8 @@ "estimatedHours": { "type": "number" }, - "interestedCampers": { - "type": [] - }, - "confirmedCampers": { - "type": [] + "moneySaved": { + "type": "number" }, "currentStatus": { "type": "string" @@ -63,7 +51,7 @@ { "accessType": "READ", "principalType": "ROLE", - "principalId": "$authenticated", + "principalId": "$everyone", "permission": "ALLOW" } ], diff --git a/common/models/story.json b/common/models/story.json index bdd86a996b..4b50e3eed4 100644 --- a/common/models/story.json +++ b/common/models/story.json @@ -69,7 +69,7 @@ { "accessType": "READ", "principalType": "ROLE", - "principalId": "$authenticated", + "principalId": "$everyone", "permission": "ALLOW" }, { diff --git a/common/models/user.json b/common/models/user.json index a7caad6227..0254ff8407 100644 --- a/common/models/user.json +++ b/common/models/user.json @@ -134,7 +134,8 @@ "type": "string" }, "uncompletedBonfires": { - "type": "array" + "type": "array", + "default": [] }, "completedBonfires": { "type": [ diff --git a/config/secrets.js b/config/secrets.js index 2ea3cdef28..ed369d9766 100644 --- a/config/secrets.js +++ b/config/secrets.js @@ -13,10 +13,6 @@ module.exports = { key: process.env.BLOGGER_KEY }, - slack: { - key: process.env.SLACK_KEY - }, - mandrill: { user: process.env.MANDRILL_USER, password: process.env.MANDRILL_PASSWORD diff --git a/public/js/main_0.0.2.js b/public/js/main_0.0.3.js similarity index 96% rename from public/js/main_0.0.2.js rename to public/js/main_0.0.3.js index 1b41b9066b..20152c48f5 100644 --- a/public/js/main_0.0.2.js +++ b/public/js/main_0.0.3.js @@ -30,7 +30,7 @@ $(document).ready(function() { }, function(res) { if (res) { - window.open('https://freecodecamp.slack.com/messages/help/', '_blank') + window.open('https://gitter.im/FreeCodeCamp/Help', '_blank') } } ); @@ -48,7 +48,7 @@ $(document).ready(function() { }, function(res) { if (res) { - window.open('https://freecodecamp.slack.com/messages/help/', '_blank') + window.open('https://gitter.im/FreeCodeCamp/Help', '_blank') } } ); @@ -71,7 +71,7 @@ $(document).ready(function() { }, function(res) { if (res) { - window.open('https://freecodecamp.slack.com/messages/letspair/', '_blank') + window.open('https://gitter.im/FreeCodeCamp/LetsPair', '_blank') } } ); @@ -150,10 +150,6 @@ $(document).ready(function() { $('#help-modal').modal('show'); }); - $('#trigger-help-editorless-modal').on('click', function() { - $('#help-editorless-modal').modal('show'); - }); - $('#trigger-issue-modal').on('click', function() { $('#issue-modal').modal('show'); }); @@ -323,15 +319,13 @@ $(document).ready(function() { .fail(function (xhr, textStatus, errorThrown) { $('#story-submit').bind('click', storySubmitButtonHandler); }) - .done(function (data, textStatus, xhr) { - window.location = '/stories/' + JSON.parse(data).storyLink; + .done(function(data, textStatus, xhr) { + window.location = '/stories/' + data.storyLink; }); - }; $('#story-submit').on('click', storySubmitButtonHandler); - var commentSubmitButtonHandler = function commentSubmitButtonHandler() { $('#comment-button').unbind('click'); var data = $('#comment-box').val(); diff --git a/seed/challenges/advanced-bonfires.json b/seed/challenges/advanced-bonfires.json index 978ebe81ce..58f6602791 100644 --- a/seed/challenges/advanced-bonfires.json +++ b/seed/challenges/advanced-bonfires.json @@ -81,7 +81,7 @@ "sym([1, 2, 3], [5, 2, 1, 4]);" ], "tests": [ - "expect(sym([1, 2, 3], [5, 2, 1, 4])).to.eqls([3, 5, 4])", + "expect(sym([1, 2, 3], [5, 2, 1, 4])).to.equal([3, 5, 4]);", "assert.deepEqual(sym([1, 2, 5], [2, 3, 5], [3, 4, 5]), [1, 4, 5], 'should return the symmetric difference of the given arrays');", "assert.deepEqual(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]), [1, 4, 5], 'should return an array of unique values');", "assert.deepEqual(sym([1, 1]), [1], 'should return an array of unique values');" diff --git a/seed/challenges/basic-bonfires.json b/seed/challenges/basic-bonfires.json index ae9b0b571a..bc75adb4ac 100644 --- a/seed/challenges/basic-bonfires.json +++ b/seed/challenges/basic-bonfires.json @@ -14,7 +14,7 @@ "Pair Programming is where two people code together on the same computer. It is an efficient way to collaborate, and widely practiced at software companies. Pair Programming is one of the core concepts of \"Agile\" Software Development, which you will hear more about later.", "Many people use Skype or Google Hangouts to pair program, but if you talk with professional software engineers, they will tell you that it's not really pair programming unless both people have the ability to use the keyboard and mouse.", "The most popular tool for pair programming is Screen Hero. You can download Screen Hero for Mac or Windows. Create your new user account from within the app.", - "We have a special chat room for people ready to pair program. Go to our http://freecodecamp.slack.com/messages/letspair and type \"Hello Pair Programmers!\"", + "We have a special chat room for people ready to pair program. Go to our LetsPair chatroom on gitter and type \"Hello Pair Programmers!\"", "If someone is available, they will be your \"pair\" - the person you pair programming with.", "If no one gets back to you in the first few minutes, don't worry. There will be lots of opportunities to pair program in the future.", "If someone does get back to you, private message them and ask for the email address they used to register Screen Hero.", diff --git a/seed/challenges/basic-html5-and-css.json b/seed/challenges/basic-html5-and-css.json index fb8c4aa952..143e92cab5 100644 --- a/seed/challenges/basic-html5-and-css.json +++ b/seed/challenges/basic-html5-and-css.json @@ -1678,7 +1678,7 @@ "You can create one like this: <input type='text'>. Note that input elements are self-closing." ], "tests": [ - "assert($('input').length > 0, 'Your app should have an text field input element.')" + "assert($('input').length > 0, 'Your app should have a text field input element.')" ], "challengeSeed": [ "", diff --git a/seed/challenges/bootstrap.json b/seed/challenges/bootstrap.json index 41a7229731..2fb852ade8 100644 --- a/seed/challenges/bootstrap.json +++ b/seed/challenges/bootstrap.json @@ -8,7 +8,7 @@ "dashedName": "waypoint-mobile-responsive-images", "difficulty": 0.047, "description": [ - "Now let's go back to our Cat Photo App. This time, we'll style it using the popular Twitter Bootstrap responsive CSS framework. First, add a new image with the src attribute of \"http://bit.ly/fcc-kittens2\", and add the \"img-responsive\" Bootstrap class to that image.", + "Now let's go back to our Cat Photo App. This time, we'll style it using the popular Bootstrap responsive CSS framework. First, add a new image with the src attribute of \"http://bit.ly/fcc-kittens2\", and add the \"img-responsive\" Bootstrap class to that image.", "It would be great if the image could be exactly the width of our phone's screen.", "Fortunately, we have access to a Responsive CSS Framework called Bootstrap. You can add Bootstrap to any app just by including it with <link rel='stylesheet' href='//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css'/> at the top of your HTML. But we've gone ahead and automatically added it to your Cat Photo App for you.", "Bootstrap will figure out how wide your screen is and respond by resizing your HTML elements - hence the name Responsive Design.", diff --git a/seed/challenges/get-set-for-free-code-camp.json b/seed/challenges/get-set-for-free-code-camp.json index b576bad9c9..a657759d08 100644 --- a/seed/challenges/get-set-for-free-code-camp.json +++ b/seed/challenges/get-set-for-free-code-camp.json @@ -56,15 +56,18 @@ "name": "Waypoint: Join Our Chat Room", "dashedName": "waypoint-join-our-chat-room", "difficulty": 0.002, - "challengeSeed": ["131321596"], + "challengeSeed": ["131574135"], "description": [ "Now we're going to join the Free Code Camp chat room. You can come here any time of day to hang out, ask questions, or find another camper to pair program with.", "Create an account with GitHub here: https://github.com/join.", "Click the pixel art in the upper right hand corner of GitHub, then choose settings. Upload a picture of yourself. A picture of your face works best. This is how people will see you in our chat rooms, so put your best foot forward. You can add your city and your personal website if you have one.", - "Now follow this link to enter our Welcome chat room: https://gitter.im/FreeCodeCamp/welcome.", - "Once you're in our Welcome chat room, introduce yourself by saying : \"Hello world!\".", + "Go to Free Code Camp's open-source repository: https://github.com/freecodecamp/freecodecamp.", + "You can \"star\" this repository by clicking the star button in the upper right hand corner.", + "Later, you'll be able to fork this repository if you'd like to contribute to our open source codebase.", + "Join our main chat room: https://gitter.im/FreeCodeCamp/FreeCodeCamp.", + "Once you're in our chat room, introduce yourself by saying : \"Hello world!\".", "Tell your fellow campers how you found Free Code Camp. Also tell us why you want to learn to code.", - "This is the best room for new campers, but feel free to join other chat rooms as well. Our main chat room: https://gitter.im/FreeCodeCamp/FreeCodeCamp.", + "We have a busy chat room, so be sure to configure your notification settings in the top right corner.", "Keep the chat room open while you work through the other challenges. That way you ask for help if you get stuck on a challenge. You can also socialize when you feel like taking a break.", "You can also download a desktop or mobile chat application here: https://gitter.im/apps", "You can also access this chat room by clicking the \"Chat\" button in the upper right hand corner.", @@ -297,7 +300,7 @@ "challengeSeed": ["127358841"], "description": [ "One of the best ways to stay motivated when learning to code is to hang out with other campers.", - "Slack and Camper News are great ways to communicate with other campers, but there's no substitute for meeting people in-person.", + "Gitter and Camper News are great ways to communicate with other campers, but there's no substitute for meeting people in-person.", "The easiest way to meet other campers in your city is to join your city's Facebook Group. Click here to view our growing list of local groups.", "Click the link to your city, then, once Facebook loads, click \"Join group\".", "Our local groups are new, so if you don't see your city on this list, you should follow the directions to create a Facebook group for your city.", @@ -316,7 +319,7 @@ "nameEs": "Waypoint: Encuentrate con otros Campers en tu Ciudad", "descriptionEs": [ "Una de las mejores maneras de mantenerte motivado cuando estás aprendiendo a programar es pasar el rato con otros campers.", - "Slack y Noticias de Campers son una muy buena forma de comunicarte con otros campers, pero no hay ningún substituto para conocerlos en persona.", + "Gitter y Noticias de Campers son una muy buena forma de comunicarte con otros campers, pero no hay ningún substituto para conocerlos en persona.", "La forma más fácil de encontrarte con otros campers en tu ciudad es unirte al grupo de Facebook de tu ciudad o país. Dale click a here para ver la lista de grupos locales.", "Dale click al link de tu ciudad o país y una vez que Facebook cargue, dale click a \"Join group\".", "Nuestros grupos locales son pocos, asi que en caso no veas tu ciudad o país en la lista, solamente sigue las instrucciones para crear un grupo de Facebook para ello.", @@ -339,17 +342,48 @@ ] }, { + "_id": "bd7126d8c431eddfaeb5bd3e", + "name": "Waypoint: Add Free Code Camp to your LinkedIn Profile", + "difficulty": 0.008, + "challengeSeed": ["131574134"], + "description": [ + "LinkedIn is a critical tool for your job search later on.", + "Add Free Code Camp to your LinkedIn profile by going to https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp.", + "Estimate your dates. Keep in mind that Free Code Camp is a rigorous 1,600 hour program, and will probably take at least a year to complete.", + "In the \"Degree\" section, type \"Full Stack Web Development\".", + "In the \"Field of study\" section, type \"Computer Software Engineering\".", + "Click the \"Save Changes\" button.", + "Be sure to add your key word skills to LinkedIn's skills section as you learn them, such as HTML, jQuery, Linux and Node.js.", + "You can expand your LinkedIn network by inviting friends you meet through Free Code Camp to connect with you on LinkedIn.", + "Make your LinkedIn profile as complete as possible. Unlike other social networks, with LinkedIn, it's perfectly fine if you don't want to add a photo.", + "Let's keep moving. We're almost ready to start coding!" + ], + "challengeType": 2, + "tests": [], + "nameCn": "", + "descriptionCn": [], + "nameFr": "", + "descriptionFr": [], + "nameRu": "", + "descriptionRu": [], + "nameEs": "", + "descriptionEs": [], + "namePt": "", + "descriptionPt": [] + }, + { + "_id": "bd7137d8c441eddfaeb5bdef", "id": "bd7137d8c441eddfaeb5bdef", "name": "Waypoint: Get Help the Hacker Way with RSAP", "dashedName": "waypoint-get-help-the-hacker-way-with-rsap", - "difficulty": 0.008, + "difficulty": 0.009, "challengeSeed": ["125407432"], "description": [ "Let's cover one last thing before you start working through our lessons: how to get help.", "Any time you get stuck or don't know what to do next, follow this simple algorithm (procedure): RSAP (Read, Search, Ask, Post).", "First, R - Read the documentation or error message. A key skill that good coders have is the ability to interpret and then follow instructions.", "Next, S - Search Google. Good Google queries take a lot of practice. When you search Google, you usually want to include the language or framework you're using. You also want to limit the results to a recent period.", - "Then, if you still haven't found an answer to your question, A - Ask your friends. If you have trouble, you can ask your fellow campers. We have a special chat room specifically for getting help with tools you learn through these Free Code Camp Challenges. Go to https://freecodecamp.slack.com/messages/help/. Keep this chat open while you work on the remaining challenges.", + "Then, if you still haven't found an answer to your question, A - Ask your friends. If you have trouble, you can ask your fellow campers. We have a special chat room specifically for getting help with tools you learn through these Free Code Camp Challenges. Go to https://gitter.im/FreeCodeCamp/Help. Keep this chat open while you work on the remaining challenges.", "Finally, P - Post on Stack Overflow. Before you attempt to do this, read Stack Overflow's guide to asking good questions: http://stackoverflow.com/help/how-to-ask.", "Here's our detailed field guide on getting help: http://freecodecamp.com/field-guide/how-do-i-get-help-when-i-get-stuck.", "Now you have a clear algorithm to follow when you need help! Let's start coding! Move on to your next challenge." @@ -368,7 +402,7 @@ "Cualquier momento en el que te atasques o no sepas que hacer, sigue este simple algoritmo (procedimiento): RSAP (Read, Search, Ask, Post). Que en español vendría a ser Lee, Busca, Pregunta, Publica.", "Primero, Lee - Lee la documentación o el mensaje de error. El punto fuerte de un buen programador es la habilidad de interpretar y seguir instrucciones.", "Luego, Busca - Busca en Google. Buenas búsquedas o queries requieren bastante práctica. Cuando búsques en Google, idealmente tienes que incluir el lenguaje o framework que estés usando. También tendrás que limitar los resultados de búsqueda a un periodo reciente.", - "Ahora, en caso no hayas encontrado la respuesta a tu pregunta, Pregunta - Pregunta a tus amigos. En caso estes en problemas, puedes preguntar a otros campers. Tenemos una sala de chat especificamente para obtener ayuda sobre las herramientas que utilizamos en los desafíos de Free Code Camp. Ingresa a https://freecodecamp.slack.com/messages/help/. Mantén este chat abierto mientras trabajas en los desafíos subsiguientes.", + "Ahora, en caso no hayas encontrado la respuesta a tu pregunta, Pregunta - Pregunta a tus amigos. En caso estes en problemas, puedes preguntar a otros campers. Tenemos una sala de chat especificamente para obtener ayuda sobre las herramientas que utilizamos en los desafíos de Free Code Camp. Ingresa a https://gitter.im/FreeCodeCamp/Help. Mantén este chat abierto mientras trabajas en los desafíos subsiguientes.", "Finalmente, Publica - Publica tu pregunta en Stack Overflow. Antes de hacer esto lee la guía de Stack Overflow para publicar buenas preguntas: http://stackoverflow.com/help/how-to-ask. Tendrás que hacerlo en inglés, en caso no sepas como, pide que te ayuden a traducir tu pregunta en el canal #espanol de Slack.", "Aquí está nuestra guia detallada en como obtener ayuda: http://freecodecamp.com/field-guide/how-do-i-get-help-when-i-get-stuck.", "Ahora que tienes en claro el procedimiento a seguir cuando necesites ayuda. ¡Empecémos a programar! Continua con el siguiente desafío." diff --git a/seed/field-guides.json b/seed/field-guides.json index 9d3e906d16..92d9757116 100644 --- a/seed/field-guides.json +++ b/seed/field-guides.json @@ -225,7 +225,7 @@ "

", "

This is the most time-efficient way to handle being stuck, and it's the most respectful of other people's time, too.

", "

Most of the time, you'll solve your problem after just one or two steps of this algorithm.

", - "

We have a special chat room just for getting help: https://freecodecamp.slack.com/messages/help/

", + "

We have a special chat room just for getting help: https://gitter.im/freecodecamp/help/

", "

Also, if you need to post on Stack Overflow, be sure to read their guide to asking good questions: http://stackoverflow.com/help/how-to-ask.

", "

Learning to code is hard. But it's a lot easier if you ask for help when you need it!

", "" @@ -279,7 +279,7 @@ "

", "

    ", "
  1. Follow this tutorial to set up your computer for streaming.
  2. ", - "
  3. Contact Jason Ruekert - he's @jsonify in Slack. He's in charge of our Twitch.tv channel. Tell him what you'd like to stream, and when you're available to stream.
  4. ", + "
  5. Contact Jason Ruekert - he's @jsonify in Gitter. He's in charge of our Twitch.tv channel. Tell him what you'd like to stream, and when you're available to stream.
  6. ", "
  7. Jason will pair with you using Screen Hero to verify your computer is configured properly to stream.
  8. ", "
", "

", @@ -492,7 +492,7 @@ " A screen shot showing you the group description box on the Facebook page.", "
  • Click the \"Upload a photo button. To start out, you'll probably just want to use Free Code Camp's banner (download it here), or a scenic shot of your city. Later you can update this with a picture from one of your city's Free Code Camp events.
  • ", " A screenshot showing the \"Upload a photo\" button.", - "
  • Message @quincylarson in Slack with a link to your city's group page and he'll include it here.
  • ", + "
  • Message @quincylarson on Gitter with a link to your city's group page and he'll include it here.
  • ", "
  • Join our Local Leaders Facebook group, where we share ideas about involving campers in your city.
  • ", " ", "

    ", @@ -625,8 +625,8 @@ " ", "

    ", "

    It's notoriously difficult to estimate how long building software projects will take, so feel free to ask our volunteer team for help.

    ", - "

    You'll continue to meet with your stakeholder at least twice a month in your project's Slack channel.

    ", - "

    You should also ask questions in your project's Slack channel as they come up throughout the week, and your stakeholder can answer them asynchronously.

    ", + "

    You'll continue to meet with your stakeholder at least twice a month in your project's Gitter or Slack channel.

    ", + "

    You should also ask questions in your project's Gitter or Slack channel as they come up throughout the week, and your stakeholder can answer them asynchronously.

    ", "

    Getting \"blocked\" on a task can take away your sense of forward momentum, so be sure to proactively seek answers to any ambiguities you encounter.

    ", "

    Ultimately, the project will be considered complete once both the stakeholder's needs have been met, and you and your pair are happy with the project. Then you can add it to your portfolio!

    ", "

    Working with your Pair

    ", @@ -634,7 +634,7 @@ "

    Here are our recommended ways of collaborating:

    ", "

    ", "