#until the admins finally make separate entries
Explore tagged Tumblr posts
canvaswolfdoll · 7 months ago
Text
this doesn't even get to the confusion that legacy heroes and shared identities would cause.
also villains and the superheroes themselves skewing results.
ratemyhero.com would be crazy
8K notes · View notes
skatingbi · 2 years ago
Text
Fighter Pilot AU - All the character's roles in the storyline so far (Pt. 1/3)
Hello everyone! I decided to organize my notes app more by adding everyone's roles to this post. So far, this AU includes Luffy, Zoro, Nami, Sanji, Usopp, Chopper, Robin, Franky, Shanks, Garp, and Mihawk. I hope I can add in Koby somehow bc Luffy/Koby has my heart but as a newbie to the OP canon storyline I'll have to read more of the manga first since I just barely got to the Water 7 arc...
Anyways, heres the masterlist of major traits, roles, flying habits, etc. that I can think of for Luffy, Zoro, and Nami! Enjoy!
Luffy: Luffy is a fucking lunatic while flying...you know the scene at the end of maverick where the enemy 5th gen pull that free flying shit and use gravity/steering alone to evade fucking missles??? yeah, luffy does that shit. bro takes "dont think just do" too literally and is somehow the top of his class bc of it. Shanks definitely taught him that.
Luffy is Zoro's best friend and also close to Sanji, but in this AU, Luffy and Zoro are either childhood friends or just happened to be in the same company together for basic training and have stuck together since then. Maybe in the past, Zoro was Luffy's nav until Nami joined the group, and then Zoro flew solo afterward like he wanted.
He's the youngest of the group for this series as well, at least under 21 but above 18. In modern standards, enlisted soldiers will be 18 or older for this AU, but I also dont think Luffy is old enough to drink. That being said, Luffy doesn't care for smoking or alcohol anyway since he prefers to eat all the snacks he wants lmao
I also believe in adoptive dad Shanks supremacy in this AU. Yes, I know who Luffy's canon dad is. No, I will not be following canon. Canon is simply a suggestion at this point, and this entire AU is self indulgent as hell anyway. Shanks being luffy's father figure means that having to spectate Luffy in the marines is both reassuring and also two seconds away from giving him a panic attack but we'll talk more about that in his own entry later.
Zoro: Zoro joined the marines with Kuina the moment they both grew out of foster care. Even though they were both in separate locations for basic training (Zoro in the east blue and Kuina was probably in the north blue) they constantly kept in contact. Kuina is essentially Zoro's big sister, and he looked up to her a LOT and is the main reason why he even became a pilot.
In the beginning, Zoro joined to be in infantry (or infantry equivilant) and Kuina joined to be a pilot (I can see her being a fighter pilot for sure, but she would also probably do well as a bomber or even a test pilot in the beginning). Kuina would always talk about her achievements and adventures when she was legally allowed to, and Zoro would do the same. After a year, when they were setting up a meeting date to visit each other since Zoro would be stationed in the North Blue with her, he gets the news that she passed away.
During his assignment in the North Blue, which was originally supposed to be 2 years long, he was pulled out a year early. This is when he meets Mihawk. This meeting will most likely be when Zoro decides to change career paths and after months of arguing with admin and the world government he can finally change jobs to be a pilot and finish what Kuina started: Becoming the world's greatest fighter pilot.
Zoro flies like he fights in the manga/anime. Defensive and only offensive when his squad is threatened. This is how he gets a confirmed kill after resuming his assignment in the North Blue under his new job title. Although he's the newest to piloting in the top gun program in this AU, he's extremely gifted, and I also believe zoro is smarter than people make him out to be as well.
Nami: Nami originally became a pilot for the pay (irl in the U.S. pilots make decent pay as far as I know, so im basing it off that knowledge. Piloting can have diverse pay, though). She wanted to send money to her family to help keep them afloat, especially since their home relies on agriculture for income. Although she prefers nav over being a fighter pilot, her skills caught the eyes of a few top gun instructors, and so she used that to be able to get accepted into the program. Her, Usopp, and Robin bond over this, despite Usopp being a talented fighter pilot as well.
Nami is also extremely smart, not only academically but also practically. Her street smarts, as I like to call them, are extremely useful to the friend group, especially when training and doing mock combat exercises. Zoro actually respects this about her and grows to become a close friend of hers as well. In this AU, when Zoro doesnt know how to talk to the men about something, he'll usually go to Nami since not only is she great at reading people but also doesnt sugar coat her thoughts or feelings.
I like to think that Luffy also latches onto her as well, and when she attempts to leave the program, Luffy immediately refuses to let her and gets the rest of the group to encourage her to stay. She's always had a rough time trusting people, but the friends she's made out of her squad members have helped her open up a lot more.
4 notes · View notes
hamsterboos · 4 years ago
Text
Have We Met Before?
This is my last entry for Rowaelin month and it's my favorite one out of all of them. I'm really proud of this one, so I hope everyone enjoys it. Thank you to the admin group for holding Rowaelin month!
Song this is based off of is Eric Nam and Sarah Barrios' Have We Met Before
cw: kind of has character death but also not
Word Count: 1821 Read on AO3 Rowaelin Month Masterlist
Day 29 of Rowaelin Month Prompt: A work based off a song
~~~~~~
Aelin was exhausted, and as she sat down in the local café in her new neighborhood, she finally felt some semblance of peace. She had just moved to Doranelle due to an incredible job offer in one of the best publishing houses in this side of the world, and Aelin would be an idiot if she didn’t take it. Granted, she was now farther away from her cousin and her best friend, but she’d deal with anything if it meant working with some of her favorite authors. Packing up everything and moving into a new apartment was hard and tiring enough, but it was even worse with the strange, vivid dreams she’d been getting ever since moving into the apartment.
She moved a hand to rub at her collarbone, a sudden ache passing through the area as she remembered the dream - that was practically a nightmare, if she were being honest - where she had been slashed against that area with a knife before she had woken up with a strange sensation of missing someone along with the deep heartache that followed it.
It felt more like a memory, but that couldn’t be possible.
Shaking off the weird feeling in her gut, she tried to focus on the open word document on her laptop screen. This was the perfect opportunity to drink some coffee, have some great pastries, and get some editing done, and yet, even after nearly half of an hour of working, her mind kept drifting off to the dream.
Sighing, Aelin looked up and was surprised to find a man sharing the coffee table with her. The table was fairly large, big enough to seat four people comfortably, and she hadn’t even noticed when the man had chosen to sit diagonally across from her. She didn’t really mind, but the strange feeling overcame her again as she took him in.
He had silver hair, and his eyes were focused on the book in his hands, and he was fairly built if the tight shirt showing off his pecs were any indication. Under normal circumstances, Aelin would’ve been more than happy to start up a conversation with him — considering how handsome he was and the fact that he was a reader — to try to get to know him more, but as she watched him take a sip of his black coffee, she was astonished that she felt like she already knew him.
But how? Aelin’s brow furrowed as she contemplated where she could’ve possibly seen him. She’d just moved to the country — there was no way she knew anyone already that wasn’t working with her. He was a stranger, and yet the more she looked at him, the closer she felt to him.
It felt like déjà vu, and as the man looked up to glance around the room, his strikingly green eyes reminded her of the eyes she had seen in her dreams. Once they landed on her face, their eyes meeting and causing an undercurrent of electricity to pass through her, it was as though all the breath had been knocked out of her.
Aelin swore she had seen those eyes before, in her dreams no less, but that was impossible. She’d never seen this man before.
It couldn’t be, and yet…
~~~
“Come on, Aelin,” he teased, his green eyes sparkling with mischief. “It’s one dance.” They were sitting on the stairs of her apartment building, and the streets were filled with music. It was the second anniversary of Terrasen becoming an independent kingdom, and the celebrations were going on in full-force. Aelin loved the happy and carefree atmosphere that the music blasting through the streets would bring about, but unfortunately, if she didn’t finish writing down her thoughts on the uprising rebellion against the current regime for Doranelle Daily, then she would just become “another one of those useless women” that her boss, Arobynn, loved to harass.
“Yes, and then one dance turns into five,” she retorted, but without any of her usual snark. “I need to finish this article for tomorrow.” Aelin held up her notebook for emphasis, showing off her unfinished sentence.
“Oh, come on, darling,” her boyfriend continued pestering, pushing her notebook back into her lap and leaning in for a quick kiss that she let him have.
“Honey, let me finish this, and then I promise we will have your dance.”
He looked absolutely petulant for a moment, his nose scrunching up in annoyance, and she reached out to ruffle his beautifully silver hair with a laugh.
“Aelin!” he protested, reaching up to push the wayward strands back down. She simply grinned at him and pecked him quickly before going back to her notebook. She heard him sigh, and she knew then that she had won him over. Her boyfriend got comfortable by wrapping his arms around her waist from behind and settling his chin on her shoulder. Aelin pressed back up into his arms, content and happy with her life.
Until, of course, everything went up in flames.
~~~
Rowan didn’t know what possessed him to sit down at a table where there was already someone sitting there, but he felt compelled to be by the woman with the blonde hair that seemed exactly like the shade of blonde that was plaguing his dreams.
He sat down on the other side of her, diagonal from her so he wouldn’t be directly in her line of sight. She seemed to be typing away, hard at work, and he decided that he would instead just focus on his book. He came out today to get some fresh air, clear his mind after the strange dreams he’d started having every night for almost a week, and that’s exactly what he intended to do.
Instead, he spent the next half hour reading the same two pages, his eyes mindlessly passing over the words, and yet he didn’t actually comprehend any of them.
His eyes kept drifting up, roaming around the room as he looked at the café without really looking, before they just ended back on the woman sitting so close, yet so far.
As he watched her type away on her laptop, Rowan felt as though this quiet, yet stange, comfort he felt around her was familiar, like he had lived through this exact moment before. He watched as she blindly picked up what looked like a sweet latte, if the amount of whipped cream on top was any indication, and then she took a bite of an apple turnover.
Yet, there was no way he had. The woman was an utter stranger — albeit, a beautiful one — and that was that. Rowan had simply lost his mind. There was no other explanation.
He directed his attention back to his book in a last ditch attempt to make some progress before letting out a frustrated sigh as he gave up again. Rowan looked back up at the bustling cafe and then at the woman, and he was surprised to find that she was looking right at him.
His eyes met her blue ones, and it could not be a coincidence that the blue eyes that he seemed to love in his dreams were the same ones that this woman had, down to the golden ring surrounding them.
~~~
They were sitting in their favorite local café, a quiet serenity surrounding them. Rowan didn’t need to be constantly talking to his girlfriend to just be happy and content with her. It was her presence that just put his mind at rest.
She was drinking an intensely sweetened milk tea, and he had just opted for a simple black tea while the two shared an apple turnover. It was one of the few pastries the two had ever agreed on, and they always opted to order one whenever they went out. Money was tight between the two of them, but they made it work to at least always be able to splurge once in a while.
Rowan looked up from his own book and smiled at the sight of his girlfriend furiously writing in her notebook, working on yet another article for Doranelle Daily. Her hair seemed to be getting in her eyes, and instead of tying it up, she kept blowing it out of her face to the point where Rowan couldn’t hold in his chuckle.
“What’s so funny?” she asked.
“You could just tie up your hair,” he responded, laughter still clear in his voice. She looked up at him, her gorgeous blue eyes narrowed towards him.
“Oh, so now my suffering is funny to you?”
“Darling,” he spoke, leaning in closer to her from across the table, “you’re just lazy.”
“Rude,” she scoffed, but she took the hair tie off her wrist to tie up her hair, anyway.
“See? It wasn’t so hard to listen to me.”
“You could try to be a little less annoying.”
“You wouldn’t love me the same.”
“I would love to have some peace and quiet right about now.”
“We could just go home,” he innocently offered.
“So you can distract me from work again? No, thank you.”
Rowan’s jaw fell open slightly out of indignation before he scowled, and that caused a giggle to burst out of her. Rowan let go of his scowl and smiled as well.
This was what he loved, what he cherished.
Until, of course, he lost it all.
~~~
The two estranged lovers watched one another, surprise written clearly over their faces. The lack of recognition between the two was overshadowed by the memories in their dreams. The love bursting in their chest, mingled with the pain of their unwanted separation burned through them, so maybe they would say that the dreams were more like nightmares.
~~~
It was a “wrong time, wrong place” type situation. Nothing more.
The couple were walking down an alley, hand in hand, happily chatting, only to be attacked by rebels, trying to rob them in the dimming sunlight.
The female tried screaming for help when the male pushed her back, trying to protect her as he fought back against the two rebels.
It wasn’t enough.
A third rebel appeared behind the female, slashing a knife across her collarbone, causing a shriek of pain to escape her. Her screams mingled with the male’s as he tried to fight towards her, but a rebel slashed him across his bicep.
The couple was abandoned in the alley only when they had been removed of any jewelry and money, instead left with slashes and stab wounds that had them bleeding out on the ground. They stumbled into each other’s arms, clinging to their love while they would not be able to cling to life for much longer.
Their last words were declarations of love.
~~~
With those last words ringing through their minds, they each felt a pull towards one another, yet she was the one who was able to utter one sentence.
“Have we met before?”
30 notes · View notes
lifebeginsbyleaving · 5 years ago
Text
Mama Mia Scotts A Peace Pimp
Hey ya!!! So this is my last entry for @sterek-bingo I've had such a great time and I'm so glad I did this!!! So all the love to the admins over yonder 💜💜💜 I hope to see you all well when sterek week rolls around. Also the biggest of thank yous and the mostest loves to @halevetica Girl you know how important you are to me. I wouldn’t have even dreamed of attempting this if it wasn’t for you. So, *strums guitar* I love you bitch. Thank you for your endless support in my shenanigans (Like shlongshire, naming this mama mia scotts a peace pimp, and my endless unnecessary backstory that stresses both of us out.) and for brainstorming with me well past two in the morning multiple times. Oh and also for your help wrangling Brian, god that asshole. She also made this amazing mood board for me ahhhhh!!!! She is so amazing an talented I love her. You should check her out!!! She writes 1000x better than me, so you will not regret it if you like sterek. Anyway, this is around 10,000 words. 
----------------------------------------------
Tumblr media
Derek could feel himself losing his patience. He got it already. Fairies were tricky. Don't offend them. Don't accept gifts from them. He got it, they all got it, hell they had it ten minutes into his half hour rant. But Stiles went on and on.
"Don't accept anything. Anything at all. Pay attention to wording. And, for the love of God, don't-"
Derek's patience snapped. "Eat anything, we know."
Scott went to move in front of Stiles, but Stiles put an arm across him. Derek puffed out his chest unconsciously.
They had been so territorial and snippy with each other lately both packs were sick of it. Especially Stiles, though. These last few months had been filled with uncooperative alpha instinct bullshit. It was the last thing they needed right now while dealing with fairies, beings that were known for being cutthroat at exploiting weaknesses to kill entire packs if they so wished it. Stiles hated being in the middle of it, but as Scott's emissary he needed to keep the peace between packs.
"Would you quit it you two. You're both pretty. And petty."
Scott protested, "You're just trying to explain everything. Why does he have to be like that? You don't even have to help their pack, but you are. He should be thankful."
Derek tried to ignore how that grated on him. Scott, unconsciously, had been referring more and more to Stiles as being his and separating them from Derek and his pack. He supposed he had been doing it as well, but he couldn't help it. Still, it didn't escape his notice that he had been pushing everyone from Scott's pack to be separate except Stiles. Deaton had warned them two alphas sharing a territory would be hard, but they could do it if they were determined. He also said some things about compromise and not challenging each other, but that wasn't as memorable. "Stiles is your emissary, not your beta. And he certainly isn't anyone's bitch. He can help whoever he wants without you."
Stiles gave him the murder face and once again, with greater difficulty, stopped Scott from going forward. "Both of you need to chill the fuck out or I'm leaving both of your furry asses and taking your packs with me."
They quickly snapped their mouths shut because they knew he could and would. Their posture slumped.
Stiles looked pleased. "Good. Now shut the fuck up if you don't want to die. These fairies aren't like the tooth fairy, and they sure as hell ain't Tinkerbell. They can and will kill you given the chance. Do not give them the chance. Watch your words and mind your manners. It is easy to offend a fairy, so don't. I don't care if you're non verbal through it."
Liam spoke up from the couch, "I don't see why we have to sit here for this. Only the pack alphas, Derek's first beta, and you, cuz you're Scott's emissary, are allowed to go."
"So you know for the future."
Issac spoke from where he was at Derek's side, "But why would they be so hostile towards us? We have that treaty thing with them. They couldn't hurt us without breaking that."
Stiles groaned and looked at Derek. "You see, this." He shoved a hand out towards Issac. "This is why I repeat myself. We don't have shit with them. Derek's mom saved the fairy queen. Her and her pack had the treaty. It's Derek pack now, hence the moot point you just made. Some things like a life debt or a blood oath can be passed through the generations, but not a treaty. Not when the terms or people involved change. Believe me, I do not want to be doing this any more than you do, but it's important. I found their fairy ring and Deaton said they would know I found it. He also said it would be akin to an open declaration of war if we ignored it. Apparently they're touchy about being snubbed and want to be introduced. Which shouldn't be a shock, they're touchy about everything. Now, the options are say hello to the fairies on our land, don't offend them, and hopefully sign a new treaty, or get the fuck out of Beacon Hills and hope they don't hunt us down. Should we put it to a vote?" He asked sarcastically.
Lydia looked analytical. "So is there something we can do to please them?"
Stiles gave her a flat look. "Other than not doing and doing all the things I've told you about for the last half hour? No, not really. Die, maybe."
Derek crossed his arms. "What do we actually need to know?"
Stiles gave him an annoyed look. "I'll start at the beginning."
There was a loud chorus of groans.
---
Stiles was glad the pack was out of his hair. He had stayed behind to help Derek clean up and was relieved to have finally shooed out Scott after both alphas had apologized. For all their bickering, at the end of the day they were friends. Even if their wolves wanted to tear the other to shreds. Stiles folded another blanket as Derek walked back out from the kitchen.
"That could've gone better. Can you help me wi-" Stiles' words were cut off as Derek hadn't stopped in front of him, but had continued right into his space. Derek wrapped an arm around his waist and quickly pulled him closer. He pulled him into a forceful kiss and Stiles was caught off guard.
Once Stiles recovered from the shock he tried to slow him down. He finally was able to pull back and ask, "Okay, what was that for?"
Derek only tried to kiss him again, but Stiles pulled back to look into his eyes. Derek huffed. "Mine." It sounded like it was barely able to be growled out.
Stiles smirked. "What's got you all gruff, sourwolf?"
Derek only reacted by sniffing deeply to smell Stiles' satisfaction. It was one of his favorites, despite how he hated seeing it on his face when they were arguing. Stiles smiled and tilted his head to the side slightly. Derek rumbled out his approval and dove into the offered space. He kissed and licked at his neck till he felt Stiles' light laugh bubble up. He pulled back and looked inquisitive.
"I bet you don't even know you're half shifted right now."
Derek immediately shifted back as if to prove his point. Stiles leaned forward with a smile and kissed him. "It's okay. You know I think it's kinda hot."
Derek kissed him again and the harshness was gone, but it was still insistent. Right before he spoke, Stiles wiggled his eyebrows at him. "I bet you were listening to Scott. I bet you only waited one second after he was out of earshot to come in here and kiss me. I bet yo-"
Derek cut him off again, but this time he added a nip to his lip to curb his snark. "Kiss me. Shut up."
Well, who was he to refuse such a polite request. Stiles wrapped his arms around his neck. Derek harshly grabbed his hips and leaned into him.
"Okay, are you going to tell me what's got you like this?"
"He said you don't have to help their pack. He said it like you're separate from us."
Stiles sighed and looked down. "I am separate Derek. I am, and always will be, in Scott's pack. I wish I could choose both of you, but if I can't, I choose him. Scott's my brother. I can't turn my back on him, not when he's always had mine. So until we figure out a way to work it out, I'm in his pack." Stiles looked up guiltily even though he'd done nothing wrong.
Derek rested their foreheads together. "He's your family. I get it. I do, anyway. The wild in me just wants you to myself though. It wants to take care of you myself. To keep you safe myself. To have you in my pack. To love you. It wants you to be mine." Derek's eyes flashed red. "Mine. I want you. I want you to share a pack with me. I want you with my pack. I want you with me."
Stiles gripped the back of his neck harder. "I am with you. I'm here. We are together."
It pained Derek how much that wasn't true. They had been dating for over six months and both packs were in the dark. He hated having to lie, but Stiles said it was for the best and in the end he agreed. He didn't want to start a pack war over Stiles with Scott. Mostly because he knew it would kill Stiles for him to have caused it. So they both agreed they'd get the alpha instinct pissing contest over with first and then tell everyone. Derek smiled at him. "You're right. You being here is enough."
Looking at Derek's insincere face rolled Stiles' stomach. "Don't be like that. Don't smile at me if you don't mean it. Don't say shit you don't believe. Me just being here isn't fucking enough." Stiles looked as sad as Derek felt. "I want to be able to stay with you. I don't want to sneak around with you. I don't want to have to make up stupid emissary shit that Scott believes because I'm a bridge between packs so he doesn't get all territorial with me sharing info with you. Or any other bullshit Deaton says. I want to belong in Scott's pack, but I also want to belong with you and yours." Stiles scratched at the hair on the back of Derek's neck.
"Fine. I hate this. I hate that we can't tell anybody. I hate that I don't get to scream it from the rooftops that you're my boyfriend. I hate that we can only go on dates in the preserve, so no one recognizes us. I hate that Scott gets more of your time. I hate that you see Scott at all, even though I know that's not really me talking and that I don't. I hate that you don't smell like me. I hate that once you walk out that door you aren't mine anymore. I hate that more than anything. God, I hate that."
Stiles kissed him softly and after kept his eyes closed with their foreheads together. "So show me tonight. Make me yours. Make me forget I have to walk out that door. Right here, right now I am yours. Make me want to wake up everyday yours. Make me crave you Derek. Make me need you. Make me yours sourwolf."
Derek's hands moved from his hips to his ass and he yanked him up and he immediately wrapped his legs around him with a smile.
"Are you going to carry me to your bed?"
Derek growled out around fangs, "I'm going to fuck you into my bed."
A thrill raced through Stiles and he leaned forward to kiss him as Derek walked him to his room. "Atta boy."
---
Derek woke up knowing the bed was empty, but a soft smile curled on to his face hearing the movement in the room around him. He squinted against the light coming through the curtains and turned over. He faced Stiles who was moving around the room to get changed. "Good morning sunshine."
Stiles looked at him and his face mirrored Derek's smile. "Mornin yourself hot stuff."
Derek grinned and patted the bed. "Come here."
Stiles obliged and leaned hand down on the bed to give him a good morning kiss. "Your breath is terrible."
"Yours is minty fresh."
Stiles flashed his gleaming teeth and picked his shirt off the ground. Derek always appreciated the lithe beauty of his mole dotted skin, but Stiles covered in the marks he left the night before would always be his favorite. Derek looked up and Stiles had caught his staring in the mirror. "I think you missed a spot."
Derek tossed the sheet aside and got up despite the slight chill. He slid behind Stiles and put a hand around his waist. "Oh sorry, did I? Can't have that."
Stiles' head lulled to the side unconsciously. "We really can't. That's the only spot people look at really. That one tiny uncovered part of my neck."
Derek smiled and started kissing his shoulder then worked his way up. Stiles carded his hand into Derek's hair.
Derek seemed satisfied. "Did I make you forget?"
"Forget what?" He seemed distracted.
"That you have to walk out that door."
Derek saw his grin in the mirror they both faced. "Baby, you made me forget I could walk at all last night."
Derek tried to smile back at him, but he couldn't muster it. Not when he hadn't gotten the answer he had wanted.
Stiles moved away to continue getting ready. Derek leaned against the dresser.
"Alright, I better head out. I'll see you in a couple hours for the meeting with the fairies." Stiles kissed him. He was almost out the door when he turned around. "Oh, I almost forgot!" He went to Derek's night stand and grabbed his bracelet. He put it on and instantly the scent of them together was everywhere in the room except on Stiles. He waved his hands a few times and let a few sparks go. The marks on his neck and undoubtedly everywhere else started to fade.
Derek's wolf howled like it had been burned. He looked away from the vanishing marks. Tears threatened to gather in his eyes. His voice was thick as he softly said, "I don't think you know how much that hurts."
Stiles turned around concerned. "How much what hurts?"
Derek gestured to his neck. "It's like you rejecting everything we did last night. It's like you regret it. My wolf thinks that you are deciding to leave me for good every time."
Derek could see the disheartened look in his eyes, but he still tried for humor. "Well, what about you? Leaning against that dresser all sleep ruffled and naked. It's practically a crime. Nay, a sin. You shouldn't be able to look that hot. How could I reject you when you stand there practically begging for someone to make sure you don't get cold or lonely. I don't know if I can leave you like that. All naked and hot."
Derek let out a huff. He muttered, "Is that all it would take?" He looked up. "I'll never put in pants again if you stay."
Hurt flashed briefly on Stiles' face and Derek instantly felt guilty. He walked over to him. "Hey, no I'm sorry. I didn't mean to say that like it's your fault. It's not up to you, and it sure as hell isn't up to me. I get that we can't do anything about it right now, it just frustrates me. I didn't mean to guilt you. I'm sorry."
Stiles folded into his arms. "I know. I hate it too."
Derek kissed him. "You should go."
Stiles nodded. "I'll see you in a bit."
Derek nodded bittersweetly.
---
"This is it? This is just twigs."
"Issac, what did I say? Watch your mouth. Besides, you can't see how amazing it looks."
Derek looked over to his wonder filled eyes. "But you can, can't you?"
They all turned to Stiles. "Yes. Ground fairy wings sprinkled into my eyes allows me to see through their illusions. I didn't want to be fooled by pretty faces as well as mellifluous words."
"Damn, that's hella metal." Issac tilted his head in consideration while Scott looked disgusted. Derek looked impressed.
"Whatever, just listen. Their spring moon festival will be going on so hopefully we can blend in with all the other royalty and dignitaries they met. And also they should be in high spirits. Ground rules. No eating, I do most of the talking, but don't ignore words directed at you, no insulting, no dancing, stay close, no gifts or favors, and-" Stiles pointed a finger in between Scott and Derek. "Absolutely no alpha macho fighting."
They looked offended but agreeable.
Stiles turned to the gate. "Now, follow me."
---
The tall intimidating ethereal being that towered over them steepled their hands. "I have given you much to discuss. We will leave you to make your decision. This room is warded against all prying eyes, no one will listen to you here." The king's impressive guard and extensive council readied themselves to leave.
All four of them let out a breath of relief at having a moment to themselves after nearly three hours of talks.
As they filed out a female voice spoke, "Father?"
Stiles caught the easy smile that took over their face. "Yes, my petal?"
She locked eyes with Issac even as he desperately tried to send help signals out to Stiles and Derek. "I want to dance with that one."
Issac locked pleading puppy eyes with Stiles.
Stiles stepped forward slightly. "I think we are all too tired, your grace. He would probably step on her toes more than anything." Stiles tried for the easy humor and high spirits they had been sharing all night.
They clearly missed the king. Their eyes went sharp and demeanor cold. "You wouldn't allow my daughter to dance the night with your beta?"
Issac and Derek both went to speak, but Stiles cut them off. "He may dance with her for one dance. Any more would be too high an honor." Stiles turned to Issac with a look.
Issac opened his mouth, but seemed to think better if it. He simply bowed his head to the king and princess.
"Very well. Come petal. Come boy."
Issac left with one final traumatized look over his shoulder. Stiles nodded calmly and confidently to him and Isaac looked slightly calmer.
As soon as they shut the door Derek exploded. "What the fuck Stiles! What happened to no dancing and stay close?! Issac is bad with this kind of thing and you just let him go? Do you just not give a shit about him, huh!?"
Stiles was about to placate him when Scott jumped in. "He's doing the best he can. Besides, he has no obligation to watch out for you. You're not h-"
Derek interrupted through clenched teeth, "His pack. Believe me, I know."
"Can we focus children? Issac will be fine as long as he listened to me. Besides, a refusal of the fairy king's prized daughter would've ended in death for all of us. They could come back any moment and demand an answer. And I don't know about you, but I don't trust our odds about getting back to the portal through that literal army of ancient ruthless beings. So stow your crap and let's get this figured out."
They grumbled but complied.
"Good. Okay, so we know their claim on the eastern woods is complete bull, and we can get out of it easily. But what are we doing about the claim hierarchy? If both of you die or are unable to lead they want to take control of the territory. Which is something that shouldn't happen, but we don't have a way out of it, not really."
"Is that what they were saying? I thought they were talking about pack kids. With all that legacy shit. Also where's the queen? What happened there?" Scott looked thoughtful. "So, what do we do?"
"We can't agree to that. It would paint a target on your backs if they ever wanted to take over and that's all they would have to do. Also, I swear to god Scott, if you bring up the queen I'll cut your balls off. If he wanted us to know he would've told us, he could kill us if she died and it's a sore spot. Now, back to business. We can leverage their spot where they are right now, I think. It takes a lot of time and energy to built a fairy circle as powerful as that one, they won't want to just pack up and leave it. Even if the land they're on is now back to your ownership. So, I say we leverage their current part of the woods for the claim hierarchy they want. Sure, what we offer them is what they have, but they don't have to put in the effort and sacrifices again to build another circle."
Derek furrowed his brows. "You said time does not concern fae and that they are willing to put in the effort. Don't you think they would just forcefully take more land and make a new circle?"
Stiles looked considering. "No. I think most of this is just to size us up. I don't think they want more than what they have right now or they would've taken it by now. The king looked more playful than aggressive, which isn't to say that couldn't change."
They went back and forth debating possible terms and conditions for several minutes.
"Yes, but the northern preserve is Hale territory indisputably. Given that, I think we're in agreement. What about th-"
The doors slammed open with a loud bang and their heads snapped up.
Issac had his hands still outstretched and his chest was heaving. They took in his appearance. He was absolutely covered head to toe in at least an inch of glitter, his hair was wild and there were twigs woven into the strands. He was wearing a long robe also covered in glitter and falling off one side. Most disturbing there was what looked almost like a dead rat that fell off his shoulder, but Stiles knew it wasn't quite a rat. There was a desperation and terror in his eyes as he spoke, "Guys! I think I just got engaged!?"
The doors slammed back closed. Scott's face looked confused. Derek's eyebrows were high in shock. Stiles just closed his eyes and tilted his head down to let out a deep sigh while pinching the bridge of his nose.
Stiles didn't even look up before he began to speak, "Issac. I thought I was pretty clear, don't accept anything from them. I'm pretty sure a freakin marriage proposal qualifies as anything!" He looked at Issac disappointed, but not surprised.
The distressed beta walked closer to his alpha for comfort. "I didn't! I promise!"
Scott still looked confused. "I thought you were going to dance?"
"We did! But then they started shoving me into this robe and covered me with glitter and put branches in my hair. I thought it was just a party thing, but no one else got a dead rat so I got concerned. I asked what's going on and they told me I'm engaged to marry princess Annalise! I can't get married! I don't even have a credit card yet!"
Derek put a hand on his beta's neck to soothe him. "Calm down. We'll figure this out." He looked to Stiles.
"Oh, don't look at me. Your dumbass beta did this. You get him out of it, big guy."
Derek gave him a flat look.
Issac looked over at him desperately. "Stiles I know we don't always get along, but please. I am literally begging you, I cannot marry her." He looked white as a sheet when he leaned forward to murmur, "When she smiles you can see bug legs in her teeth."
Scott's face scrunched up. "Gross."
Stiles grinned. "And you can't even see her true form. That'll give you nightmares come wedding night." Issac whimpered.
"Stiles." Derek raised an eyebrow. Stiles huffed and crossed his arms. Derek simply raised it higher. Stiles rolled his eyes. Derek raised the other one and looked expectant. Stiles squinted at him. Derek kept both brows up as he tilted his head towards Issac.
Stiles huffed and threw out his arms. "Oh, my, god, fine! I'll think of something."
Scott piped up. "Wait, would you have to stay here if you married her?"
Derek sighed. "Well, she certainly isn't going to become a PTA mom."
Stiles huffed. "Issac, explain. Everything. From the beginning. Don't leave anything out."
"We were just dancing and not talking like you said, then they grabbed me and started doing all this weird stuff to me." He shook some of the glitter off and a twig fell from his hair.
Stiles looked confused. "You didn't talk at all?"
"No. Nothing. Other than when she asked to dance."
Stiles closed his eyes breathed through his nose heavily. "Yeah, and what exactly did she ask you?" He squinted at him and pursed his lips while nodding waiting for the answer.
He seemed insistent for the first part. "She just asked..." His eyes widened. "For my hand."
Stiles turned away from him to face Derek and Scott. He threw an arm behind him to the general area of Issac. "This! Is why you listen to Stiles! This! Is why you appreciate Stiles and listen to him! This! Is why Stiles is always right and you listen to him. This! Is why when there's a clan of fairies about to declare war on you if you don't meet them you show up to the fucking pack meeting ready to mother fuckin-"
Scott and Derek chorused with Stiles. "Listen to Stiles." "Listen to Stiles." "Listen to Stiles."
"Exactly!"
"If it helps, I'm sorry for not listening."
"If it helps, I'm only moderately considering wishing her well on training you to listen to her and hoping she likes scarves."
The door opened, this time much more calmly and less violently. "The king would request to see at least one of their mortal guests. If not the groom, then the emissary."
Issac made a choked off noise and looked wildly at Stiles before opening his mouth just to be interrupted.
"I think our discussion has concluded. We will all join the king to finalize their treaty terms."
The two guards filed out into the hall. Scott followed them and Derek motioned for Issac to do so as he fell into step with Stiles at the back. They had a bit of space between them.
"Have you thought of something yet?" Derek whispered.
They both kept their eyes forward. "I'm working on it."
"Well, work faster. You know what I'll do to you if you don't get my beta out of this." It was said with harshness in case someone was listening, but after he finished he looked over with a raised brow and smirk. Stiles resolutely looked forward and shut everything else out to focus.
The no sex treatment was brutal.
Stiles' mind raced with ideas on how to get them out of this. He thought about all he knew about fairies and couldn't think of anything about how to get out of a marriage proposal. There were so many stories, but none that didn't end in death. There had been one thing about a fairy and a human truly falling in love, but the groom made his bride dance until she died. Definitely not the solution, no matter how much he didn't get along with Issac some of the times, he was still a good friend. Stiles and him had grown closer even despite the occasional ribbing or friction.
They came up on the dance hall and were guided through the bustling floor to the king's harvest table. Annalise immediately went to Isaac's side with a sharp toothed smile.
Stiles thought about all the different fae he'd read about and their rules. Somehow he didn't think spilling some salt would help here. He tried to remember everything he'd read, but there was so much and somehow he couldn't think of anything. Stiles began to feel frustrated as he had to tune out the three of them talking with the king trying to buy him some time. Deaton had showed and told him so much, why was it so hard to get them out of this! He had a story or book about everything. About lore, about fae folk, about how Talia dealt with them and got her peace treaty. He made it sound like a movie. Talia sounded like a great hero to him. Stiles was next to tears as he thought about how much better at this she would be.
Wait...
Stiles remembered a lore book about how, if a person saved a fairy child, that person could dictate what that fairy child did. Most used them for an I'll advised marriage, or slave. Both never ended well. They would just have to be careful to make it seem like they aren't wronging them. Talia had gotten her peace treaty because she had saved the life of the fairy queen. The fae hated owing or being in someone's debt so they penned the treaty. If Stiles gently mentioned that the king's daughters would never have been born if not for Derek's mother. They would owe Derek for them. In that same book he learned that blood oaths and life debts were passed down, even if treaties weren't.  Stiles smiled as a plan took root. He would mention the life debt and that that Derek could claim to dictate Annalise's life as well as her sisters'. They would say very carefully that they wished her nothing but happiness in a marriage to a fae to continue the line of great rulers. Perfect!
The king was speaking, seemingly agitated. "You speak in circles more like fae than humans. Enough. Why can't you marry my beautiful daughter Annalise?" They demanded and let just a little of their glamour fade to reveal their horrific face. The once glittering beautiful wings turned to a pitch black with twisted roots digging into and fixing them to their back.
Stiles was ready to jump in and save the day. "I would lik-"
Issac blurted and full volume, "Because I'm already married!"
Stiles craned his neck to look at him with an incredulous look. Scott looked bewildered and Derek just swore under his breath.
The king looked disbelieving. "Really?"
All four of them looked at each other as hopelessly lost and fucked as they felt.
They were in an unfamiliar place with a literal supernatural army between the four of them and the door. There was no way they could fight their way out, and his last plan was shot now, when they had to get him out of this lie first. Stiles figured he might as well roll with it.
"To me." His words came out just as Derek's did. "To me."
Stiles and Derek caught each others eye.
Stiles cleared his throat and gathered himself. Derek knew from the set of Stiles' shoulders he wasn't going to like what came next. He walked up between Derek and Issac and grabbed each of their hands. "To us." Stiles gripped their hands as harshly as he could for getting them into this before letting up.
A ripple of chatter erupted from the king's table, but the dance hall around them continued the festivities.
The king narrowed their eyes before motioning for a servant to come forward. They whispered into his ear and the servant left. "We will see."
Stiles swallowed harshly and Derek squeezed his hand.
The servant hurried back in with what seemed to be a crystal vial of a shimmering light blue liquid. The king tilted their head back and the servant put a few drops in each eye. The king blinked before focusing intently on the three of them.
Stiles had his eyes narrowed in confusion before they widened. "You're using fairy wings."
The king focused on Stiles. "Don't sound so appalled boy. Did you think we didn't know you used some as well to see our true forms?" They smiled. "Fairy wings have many magical properties, but most notably their use for sight magic. Mix the right ingredients in and you can see just about anything. For example: myrrh, basil, and valerian root."
"And what are you using those ingredients for?" Scott inquired.
"If one knows how to look, you can see a sort of line, a link one might say, between people. You can see what ties bind people. I believe wolves think a pack bond is something intangible by everything except instinct, but they are wrong. There is nothing magic cannot see or touch with the right entity wielding it. No matter how one tries to his or conceal it, it is always set free with patience. Ah ha, there you are."
They all took in a breath and held it as they looked in-between them. They looked puzzled for several moments. They tilted their head and made an inquisitive noise. Their council began to murmur and that seemed to distract them.
"Oh. Most interesting." They turned to their daughter. "My poor sweet Lise, the wedding is unfortunately off."
They let out a relieved, if not confused, breath.
Scott spoke, "Wait, what?!"
The king turned to Scott with a predatory grin. "You. You are quite the enigma. True, we had wondered how two alphas were possibly keeping the peace sharing a territory, but this? This was unexpected. A true alpha arranging a marriage between his emissary and greatest friend to his rival alpha and also his rival alpha's first beta? Unexpected, but well played." The king looked like they were appraising a clever chess game. "I am curious how you knew that an emissary building a relationship with a different alpha can quell instinct and unite packs?"
Scott gaped at him.
Stiles let go of Derek and Isaac's hands to wave his around. "Wait. What?"
The king turned to him with furrowed brows. "You did not know? Hm, I would have thought you would have been the one to figure it out. Clever human must not be as clever as I thought. Yes, he used you. But with how strong those bonds are I would say it did not work out entirely disadvantageous for you, did it?"
Stiles didn't know how to respond as Scott gave him a, 'What the fuck?!' face. Stiles sent back a, 'Just go with it!' face. "I would say not."
"Well, now that the nuptials are halted, should we continue our negotiation?" The king settled back against their chair.
Stiles quickly gathered himself yet again. "As the emissary representative of both packs I put forth the same treaty you and Talia Hale had. She gave you favorable terms and we are willing to do the same. You stay here and live on our territory peacefully in exchange for protection against things. You can draw from the nemeton without dealing with the things it draws. You stay on your side of the circle and we will keep our side there. We find it agreeable that instead of involving you in the care of our territory through a claim hierarchy, you keep your portal here. It would take a great deal of effort and sacrifice to move your circle closer in order to defend and manage Beacon and the nemeton, if it were ever to come down to a claim. It is better for all parties if we manage our territory and you manage yours. Agreeable?"
The king held his chin up by resting it on three of his fingers. "And if we want more?"
"If you wanted more then you'd try to take it. Are you?"
The king spoke aloof. "And if we did try to take your land?"
Stiles' eyes went hard and cold. "We'd protect it."
Scott looked to Stiles nervously after his risky answer.
The king grinned. "Good. No sense in having a treaty with packs that won't protect their land or us." He turned to Derek. "Your mother would approve of this one. He reminds me of her. His voice never wavered, exactly like hers. But do not be concerned with your strength little human." They looked at Stiles with an almost paternal interest. "Her hands shook just like your as well."
Stiles gaped, awed at how the king had seen right through him. He wondered what ingredients he had used for that one, or if it just came with a long life. Derek looked down at Stiles' shaking fist and reached out to hold it. Isaac saw it and after momentary hesitation mirrored it.
They laughed and then inclined their head toward their hands. "You know, it is intriguing to watch you mortals run in circles. You have such short lives so you dare not waste time looking to the past to learn from it, but we fae live long enough to see you as what you really are. Rats. Forever spinning on a wheel. Fun to play with and good pets, but ultimately you end where you started."
Everyone looked confused and they all looked to Stiles then, but he was just as confused.
"True, everyone in her pack looked to her just as you all look to the emissary, but that-" They once again motioned to Derek and Stiles' hands. "That was what your father did when he noticed her trembling. He didn't take over, he didn't talk over her. He supported her and trusted that she could handle it. Round and round you go, living the same lives in different bodies. He may have an edge to his voice like she had, but I see the same steadfast faith your father had for your mother in your eyes. You carry it for the emissary. The same relationships in different people. You bore me. Give me one good reason I should let you leave here alive. Especially when the fae could do so much more with the land."
Derek knew the fae could sense the fear coming off each of them.
Stiles spoke with conviction, "Does the juniberry flower get less beautiful with each passing season that they bloom? Is every peaceful ruler boring because there have been so many before it? Is a trick any less fun because you've already pulled it? You cannot deem us less worthy of life because we live it with the same burning love of those before us, the same beauty, the same compassion, the same embrace of frivolity. Repetition, while in our nature, isn't its entirety. Humans are known for their growth. Fae are born with magic and always have been. Humans learned to harness and use it. We grew with it, we invent and change it. There will always be humans fighting to love, to discover, to live, to be happy, to destroy, to hate, to do so many things good and bad. You call that fight not as important while you sit on a throne built by fae who did all the same things. The fact that you are immortal does not exclude you from the truth that you are also a part of the circle. Here you are again making another treaty. We are not two forces, we are one. But if you would like to divide us in two, pit us against each other in a way that would cost both sides lives, you are not breaking the circle. You are completing it. There has always been war, there has always been peace."
The king smiled. "And what would you have me do?"
"Do not attempt to break the circle. Appreciate it. Slow down and realize there have been before me, there will be after me, and I am being now. Make peace when possible, and war when it is not. Create when you can, but also destroy when it is necessary. Love your family, hate your enemies. But most prudent, know the difference between friend and foe, and have the wisdom to act accordingly. That his my advice, take it or leave it." Stiles bowed his head slightly while all three boys looked at him awed.
The king looked impressed. "You have moved my opinion and taught me, that is no small feat. Consider the treaty done according to your stated terms. Will you accept this favor from us?"
Scott and Derek went to jump in, but Stiles held up a hand. "We will accept no favors, but we accept the treaty."
The king nodded approvingly. "You are the clever human. Well done. Not many survive a fairy court. Much less on that was intent on killing them eventually from the moment they walked in. Consider the treaty in effect. This will probably be the last time you hear from us. That is, unless you need a favor."
"We'll see about that one."
The king motioned to the guard.
Stiles bowed and the other three followed suit. "It has been an honor."
The king bowed back. "Likewise emissary." The king nodded to the other three. "You as well." He looked to a guard who then began to lead them out. As they left fae talked and pointed at Stiles as they walked out.
They made their way back through the halls and to the circle.
"Well, we're not ones to over stay our welcome." Stiles nervously laughed. Upon seeing the fairy's unchanging face he nervously shoved Issac through the circle. "Best be going." Derek stepped through and they both followed.
---
As soon as they stepped back into the, now dark, woods they spoke hysterically, "Stiles, what the fuck!?" "What the ever loving hell Issac!" "Oh my god guys we made it! Hallelujah." Derek remained quiet.
Stiles turned to Issac. "Hallelujah. Hallelujah?! Like I want the one that got your ass out of there?"
Scott looked absolutely shell shocked. "Stiles? What the fuck?!"
Stiles looked back through the circle and saw the impassive guard still there. He gave a tiny wave. "Not here guys. Let's get back home."
"But yo-"
Stiles grabbed his arm. "Not. Here."
They walked in silence back to their cars.
"Let's talk at the loft. If my phone is right it's been over eight hours. Our packs will be worried."
Derek nodded. Scott jumped into the Jeep. Stiles followed him and started it. Issac watched them turn around then drive away before whirling on Derek. "What the hell? Why did the fairies think we had a bond?"
"Get in. It's going to take a little bit."
Derek started from the beginning and explained how Stiles and him had been in a relationship for over six months, how Stiles didn't want to betray Scott and his pack, and how the packs absolutely could not know, under any circumstances.
Issac understood quickly and they were on the road to the loft.
---
"Wait, you guys got the treaty signed, but somehow Issac almost got married off and then he did. But to Derek and Stiles? Now I'm kinda sad I didn't get to go. His little sad puppy face would've been hilarious." Jackson snorted.
Erica crossed her arms. "If you would have gone they would've taken one look at your cold conniving heart and made you stay because they thought you were one of them."
Lydia high-fived her and Jackson flipped both of them off.
Malia looked confused. "Did you actually all get married?"
Stiles sighed. "No matter how many times a different person asks, no. No, we did not get married."
Thankfully he got Scott to the loft without answering anything, but now it was him against both packs, who had been waiting for them together.
"Why isn't my brother here yet? Check your spouse bond. You can telepathically speak to your spouse if you're a werewolf. Ask him."
Stiles was so sick of them. "Cora, you absolutely cannot telepathically speak to your spouse if you are a werewolf. For Christ sake, you are the only born wolf here! You know that, stop being a dick."
She snickered.
Erica decided to join in. "Go on Stiles, check your spouse bond." Boyd cracked a small smile beside her.
"There is no such thing as a spouse bond!" He sounded manic.
"So you are married?" Allison played dumb.
"I swear to fucking Christ I will murder you all!"
As he screamed that Derek and Issac walked in with hesitant and fearful faces. "Bad time?"
"Perfect. Get in here and tell them we didn't all just get married."
"We didn't?" Issac looked relieved. "Oh thank fuck. I mean, you guys are better than Annalise, but no thanks. I thought with that bond shit he did he married us."
Jackson and Cora snorted.
Derek's pack walked up to him and checked to see if they were alright. "And just where the hell have you been? Stilinski drives recklessly, but he's not that much of a speed demon." Cora crossed her arms.
"Had to make a stop." Derek gruffly replied.
No one believed it.
Lydia finally piped up after having an analytical look on her face for awhile. "Wait, but how did the king see the bonds? He would've had to have seen something in order to believe you guys. Fairies hate lying. He must've believed you. What did he see?"
Issac looked at Stiles and Derek's panicked faces and thought about how much Derek had stressed their relationship remain a secret. His wolf howled for him to quickly defend and protect his alpha. He anxiously tried to think, but there were to many people staring expectantly. "I'm fucking Stiles!" He blurted.
Everyone's faces went wide with open shock, especially Stiles'.
Both packs instantaneously hurled questions. They overlapped and drown each other out with their volume.
"Everybody stop!" Stiles commanded.
There was silence.
"And here I was thinking Isaac was a bottom." Jackson snarked.
At least eight, "So did I."s were heard.
Isaac's cheeks flamed.
Stiles rolled his eyes. "He is a bottom. But thats no-"
The questions came from everyone except Issac who looked embarrassed and Derek who looked reserved.
"Everybody shut up! I'm not fucking Isaac!"
There was confused silence.
"Yes you are!" Isaac replied petulantly.
The shouting began once again.
Derek burst and finally roared at them while showing his eyes and teeth. They stopped. He grabbed Stiles' wrist and began yanking him behind himself. "We need to talk."
Scott instantly moved closer. "Whoa, whoa. Just because he's dating your beta doesn't mean you can shove him around! I get that you don't like it, but you don't see me pushing Isaac somewhere to give him the shovel talk."
Derek just growled threateningly.
Scott was about to respond when Stiles got in-between them. "Hey, hey, stop. No. Bad dogs. No fighting over the Stiles. Scott, just let me talk to him. I can handle this."
Scott opened his mouth.
"Remember what we just learned about trusting Stiles?" Stiles raised his eyebrows.
Scott closed his mouth and backed off.
Derek continued dragging Stiles up to his room. As the door shut behind them, Stiles was grateful for the soundproofing. "Thank God. I hav-"
Derek harshly clawed off Stiles' bracket without tearing his skin.
"Dude! What the hell!"
Derek didn't respond he just slammed Stiles against the wall and shoved his head into his neck.
"I repeat, dude, what the hell!?"
Derek licked a wide stripe up his neck. "Mine." He licked another stripe up the other side. "Mine."
"Okay, do you mind explaining? Because I'm starting to feel like a milkbone."
Derek teased the sensitive skin of his neck between his fangs. "He said we all had bonds."
"Yeah?"
Derek pulled back and looked calmer, but sad. "He saw bonds between all three of us, not just me and you. And then Isaac said that, so I thought-"
"You thought Isaac and I?"
Derek nodded to confirm. "I thought you were fucking him too. I needed to know, to smell that you were just mine."
Stiles shoved him back and off of him. Derek's eyes flashed hurt, but Stiles' held anger. "Fuck off!" He shoved his chest again. "Fuck off if you think I would ever do that to you. And especially fuck you for implying all we do is fuck. Derek, I love you. Fuck you for thinking that." Stiles' voice broke as he said the last sentence. Tears started to fall from his eyes. "God, fuck you so much."
Stiles went closer to the door and Derek quickly followed. He grabbed Stiles' arm. "Hey, hey. No. No baby, please. I'm sorry. I'm so sorry. It's just, shit, we can't tell anybody, you never smell like me, you use spells so I don't smell like you, we can't even go on dates. I'm going out of my mind here. We are so much more than fuck buddies, that isn't what I meant. I just want you to be mine. Hell, that's all I've wanted for the longest time. I just want you." Stiles turned back to him and Derek leaned their foreheads together. "I just want you. I love you."
Stiles closed his eyes and another tear raced down his cheek. They stood there together for a moment.
"Don't lose me thinking you already lost me. Because I swear to god Derek if you ever accuse me of cheating again, I'll shove wolfsbane so far up your ass you'll have to pick it out of your teeth. I love you so much it hurts my heart knowing you thought that about me. I could, and would, never cheat on you. You hear me Derek Hale? Never." Stiles looked deep into his eyes with glossy ones. "You're it for me. God, you are. You're the person I want to wake up beside and not have to leave covering up your marks. Hell, I don't want to leave our bed at all. I don't want to ever have to leave you. It tears me up inside."
Derek kissed him and Stiles kissed back ferociously, like he had to leave the second their lips parted. Stiles pulled back for air, but clung onto his neck desperately.
"What are we going to do?"
Stiles wiped his eyes and then  smirked. "I've got a plan."
"I'm going to hate this."
"You're going to love this."
"I have hated literally every single one of your plans since day one."
Stiles drew circles in the hair on the back of Derek's head with his finger tips. He smiled. "You didn't hate the one with the picnic and the strawberries with chocolate sauce and the-"
"Okay, I liked that one."
"You didn't absolutely hate your birthday with the-"
"Yes, I did like that one."
"What about two weeks ago with the woods and th-"
"Alright fine, your sex plans are perfect. Is this a sex plan? I would like to stress that this is the only time I'll say this, please say no."
"No, it is not a sex plan."
"Oh good. Then I probably will hate it."
Stiles grabbed his hand and laced their fingers together to pull him along. "Let's find out."
"Wait, wait! You're not wearing your bracelet."
"I don't need it."
Derek's eyebrows furrowed. "Have you finally learned how to block your scent?"
"No. Thanks for rubbing it in. I just don't need it." Stiles once again turned to the door and he stopped him.
"If you walk out there, they'll know. Scott, your pack. I can't do that to you. No matter how much this hurts, I can't do that because I know how much it would hurt you."
Stiles smiled softly and kissed him. "I love you for that. But it's okay."
Derek started to shake his head, but Stiles put a hand on his cheek. Stiles grinned. "It's okay. Trust Stiles." He pecked his lips and looked at him expectantly.
Derek nodded his head and Stiles' stroked his cheek with his thumb. "Perfect. Now, follow my lead, and when the moment is right you better sweep me off my feet, Hale."
"How am I supposed to know which moment you're talking about?"
"Trust me, you'll know when it's the moment."
Derek's eyes went emotional and his hand gripped Stiles' tighter. "Every moment with you is the moment Stiles."
Stiles rolled his eyes and kissed him, then pulled him to the door. Right as he reached for the doorknob he hesitated.
"What?"
"Next Friday is half off milkshake day at Sassy's. You'll order curly fries too. And I will eat half of them while you pretend not to notice. I want a proper out in public diner date. I'll meet you there at seven. Don't you dare be late, sourwolf."
Derek was over the moon. "Don't you dare be late. We both know I'm going to be there twenty minutes early nervously organizing the sugar packets and wondering if I put on enough cologne. Next Sunday I want to have breakfast with your dad. Don't you dare embarrass me."
"Perfect. And you know I will, but it won't matter because you've already won him over."
Derek held onto his hand like a life line. "Perfect."
Stiles let go and marched down the stairs. Derek followed.
They all quieted, but heard the last thing uttered. "You don't think he'd kill him for fucking Isaac, do you?"
"I'm not fucking Isaac, Alli."
"You ar-" Derek silenced Isaac by lifting a hand up. Isaac looked at him questioningly.
Derek shook his head. "Isaac is not fucking Stiles."
Stiles piped up, "Derek is fucking Stiles."
Everyone was stunned silent.
Derek's face was still not giving anything away. "And sometimes Stiles is fucking Derek."
Isaac let out a relieved breath. "Oh thank God that's over. Erica asked me what your face looks like when you come."
Derek shot her a dirty look and she stuck out her tongue. "Now I'll just ask you."
Everyone's shock faded at once, other than Scott who remained stunned. Loud, 'I told you,'s and, 'You owe me,'s exploded.
"For the love of fuck, shut up!" Stiles screamed.
Everyone looked at him.
"Thank you."
Scott finally caught up. "Wait. What!?"
Stiles turned to his gaping face. "Now Scott, I would like for you to bless the Hale alpha and I. Officially, that is. It's a little too late otherwise. Been there, done him multiple times."
Scott still looked confused. "Wait, like the fae king said? No! I don't want to use you like that! I'm not going to pimp you out for peace!"
Stiles rolled his eyes. "Scotty, keep up. Me and Derek bone like bunnies, we're in a relationship. I want to stare at his stupid face multiple hours of the day for the foreseeable future."
Scott looked like his brain broke.
Stiles huffed. "Oh for the love of God. I love him!"
Scott's face melted into a sappy grin. "Bro really?"
"Yeah, really."
Scott looked over to Derek who had a flat face. He sighed. "I love him too."
Scott turned back to face Stiles. "Broooo!"
Stiles grinned and looked down. "I know."
Scott seemed to get serious. "Okay, I give you to him."
Stiles pinched his brow. "You're not giving me over like I'm the last dinner roll on Thanksgiving dinner. You're giving your agreement and blessing to our relationship."
"Okay. I bless you."
"What are you, the pope?" Jackson snarked.
Scott's shoulders went up in a shrug. "Well, sorry! I don't know how to do this! I'm fine with it okay! You have my blessing."
Erica turned to Stiles. "You're good to go the next time you sneeze."
Derek pinched the bridge of his nose.
Stiles furrowed his brow in concentration. Derek put an arm on his shoulder. "What is is?"
"It should've worked."
"What should've worked?"
Lydia spoke, "You were hoping that if Scott blessed your relationship, you could bridge the two packs like the king said. You were hoping to make them one."
"But it didn't work. Maybe, Scott are you really not okay with it?"
Scott looked defensive and confused. "What? No. I'm so super okay with this! It's not me. I just want you to be happy. I know Derek is a good guy. It has to be something else. Stiles are you okay with it?"
Stiles looked defensive and snippy. "Of course I'm okay with it! I'm the one that wanted this! I am so beyond okay with this! I'm actually out of this universe okay with this! Derek are you okay with this?"
Derek looked like it was obvious and crossed his arms at the stupidity of the question. "Yes." He turned to Isaac sarcastically. "Are you okay with this? Husband ours?"
Isaac answered genuinely, "Yeah, of course."
Stiles crossed his arms back at Derek. He started to pace. "Okay, that should've worked. Why didn't work? The king said I could be the bridge to the packs, but why didn't it work? Do I need to do it with Isaac too? No, that doesn't make sense, it should work with just Derek. Maybe I have to actually marry him. No, in magical matters usually intent matters more than the actual contract. I intend to be with him. I intend to unite the packs..." Stiles looked up and stopped pacing. "Maybe its not about my intent. Or Derek's, or Scott's. You can't force a wolf to accept a pack. They have to choose it. I'm supposed to be the bridge, but you all still have to walk across it. You all have to choose to join each other. If I'm uniting packs, I kinda need packs permission. Are you guys okay with it?"
Four, 'Yeah!'s were heard and one, 'Hell yeah!' sounded. Cora looked at Stiles with squinted eyes. "Don't break him Stilinski."
They all turned to Jackson. He huffed and turned to Derek. "If Stilinski comes over at midnight to watch The Notebook with Lydia and he wakes me up with his blubberin, it's your ass I'm gonna paralyze."
They looked to Erica. "You all know I'm going to say yes. Especially with all the work batman put into trying to get the packs to get along."
Derek and Scott looked confused.
"Oh come on, we all know Scott is clueless, but you didn't know Derek? Lydia and I have standing nail appointments together ever since he took her on a day I just "happened" to be going. Jackson and him help Isaac with his complicated social worker law shit on Thursdays, which I have no idea what kind of magic he uses for that. Somehow, god knows how, he found out Boyd used to go deer hunting with his dad, and now he goes with Malia. That's just some of the shit he's done. Hell, he put together a training session without you guys about how to deescalate alphas challenging each other."
Cora piped up, "Oh come on Derek, you haven't smelled Isaac coming home on Fridays?"
He didn't want to mention that the spell Stiles used to get rid of his scent on Derek also kept him from smelling Stiles sometimes.
She continued, "He reeks of the sheriff and Stilinski. The sheriff all but adopted Isaac after hearing his sob story. He goes over there every week. Stiles is the main reason he's even surviving college. He wanted to get close to your beta, so he put all the fighting behind them. Well, most of the fighting." She shrugged.
Scott and Derek looked at Stiles. "Oh, don't give me that. The packs needed a lot of work, forgive me for wanting a head start. I wanted for them to at least be friends by the time you two got your heads out of your asses. Side note Derek, the bond between Isaac and I the king saw was probably the new friend thing we've got going on and the bond I was trying to forge to bridge everyone. That paired with how close you and Isaac are he probably couldn't tell the difference. Sight magic is hard, especially if there's a block. Like my bracelet or the spells I use on you. It probably muddled our relationships to each other enough." He turned to Erica. "Also, that wasn't a yes."
She rolled her eyes. "Oh for godsake, yes, you can be my new daddy Stiles. Scott too."
Just like the latch clicking behind you when you get home, they all felt the new pack bond slide into place like it was always waiting to.
Scott whispered awed and joyful, "Did we all just become one big awesome pack?"
Derek pulled Stiles' body to himself and dipped Stiles with a passionate kiss.
The pack hollered around them and Derek pulled him back up. "That was the moment, wasn't it?"
Stiles smiled at him. "Every moment is the moment with you, big guy."
64 notes · View notes
intotheflowergarden · 6 years ago
Text
Changes
Tumblr media
I shuffled into the room as silently as possible, not wanting to disturb the already settled silence in the room. Yoongi stood with his back to me, hunched over his desk looking down, and I felt my heart ache a little. Seeing this crumbled form of him seemed foreign and unreal, but I knew how and why he came to be this way. 
I slipped deeper into the room and finally was standing next to him. He turned his head a bit to see who it was, once he saw it was me he sighed deeply. His voice wavered a little when he said, “What’s the matter?” I smiled weakly and turned around to match his stance. “Meh, parties aren’t totally my thing. Everyone else is happy though.” I replied and examined the desk. 
It was his journal entries, his half-written songs, and his poems that only a few people knew about. One of those people being me. 
Yoongi hummed in response, unable to form any other words at the moment. I knew he was hurting seeing my best friend happy with someone else, but I also knew he was not shallow enough to be angry. He was happy about it.
  I was desperate to see his smile for some odd reason and rushed to find a topic to talk about. I cleared my throat and his pretty brown eyes looked at me. “You know, whenever you went off to work, Jade read all these.” I chuckled a bit and Yoongi didn’t look surprised. “She would read me the juicy ones and whenever she found one about her she would just freak! She was so in love with you and—“ 
I stopped. His smile faded long ago, and my plan had backfired. He looked even sadder than when I came in. 
“I-I’m sorry Yoongi...I didn’t mean to—“ 
“It’s okay. It’s only the truth.” He cut me off and I felt like a slowly deflating balloon as I looked at him. 
He let his head drop farther to try and hide his face from me. His minty hair covered his eyes expertly. 
“Sometimes I wonder if it's something I did wrong...or if I could have tried harder.” He stumbled over the last few words before there came a light sob. 
My heart broke and my body acted on its own. I reached around his waist and leaned into his narrow back. My frame just barely fit inside of his and I squeezed him tight as he sobbed. I didn’t know if my hug was enough so I spoke. 
“No Yoongi...she loved you. She loved everything about you, but sometimes feelings just change. You wanted to focus on work, she wanted to chase her own dreams...people just drift apart and feelings move forward. It’s nothing you did. I know that.” Yoongi stood up straight and slowly turned to face me. We were about the same height, so when he leaned forward just a bit to lay his forehead against mine, it was comfortable and felt right. 
His cheeks were stained with pretty, glistening tear streaks. His minty hair was messed up a bit and his eyes were bright from the tears. He looked so beautiful at this moment, being his realist self, letting his feelings bubble to the surface. 
“I loved her too.” He whispered. 
I felt a few of my own tears slip and I sighed shakily. “You’ll let go one-day Yoongi.” I reminded him and he gave a small nod. 
For many moments we both seemed to get lost in each other’s eyes. I was trying to make sure he was okay but he seemed to be searching for something. It didn’t take long for me to become aware of our extreme closeness. Before I could pull away, a single tear slipped out of his left eye and I instantly reached up to catch it. I wiped it off with my thumb and went to drop my hand. 
Yoongi’s hand caught it and ever so gently he led it around his neck. He closed more of the space between us, and his eyes moved from mine to my lips. My heart began to pound in my chest, my eardrums, and I could feel it in the pit of my stomach. I felt his free arm slip around the small of my back to pull against him. 
Before either of us could think about what was happening he kissed me. I distinctly remember feeling warmer than I’d ever felt before. I felt so safe, so secure. His hand trailed down my forearm and everywhere his fingertips touched, goosebumps arose. The kiss was full of uncertainty but there was also deep caring inside of it. 
We both pulled back but neither of us separated right away. I was blushing I knew, and Yoongi was a bit too. His hands reached up and pinched the apples of my cheeks. I smiled a bit and so did he. 
“I should go back to the party..” I said quietly and Yoongi’s smile melted a bit. “Oh yeah...I forgot.” He mumbled and slowly released me. 
I didn’t want him to go so far away.
What was happening? 
“I’m sure the others will get worried if you don’t come out too though.” I warned him and he sat on top of his desk. He crossed his arms over his gray v-neck shirt and shrugged. 
“I may come out in a bit, you can go.” He told me. I nodded and turned to leave. 
“Hey Rose,” His deep voice so rarely said my name. My heart jumped at the sound and I knew I was in trouble. 
I turned to face him and I saw a jaw-dropping smile spreading on his lips. “I want to do that again sometime.” He said swiftly and I blushed. 
With that, I exited the room with newfound feelings in my heart, and a secret to keep until I knew what was happening.
---Admin Rose
3 notes · View notes
Text
Baggage Claim
Good morning to all you folks and happy Friday! Here to start off Admin T’s Birthday Extravaganza (which, subsequently, is the tag you can use to search for all of the stories) is none other than Nobunaga! As stated in the update post earlier, linked here, I will have a short uploaded every day leading up to my birthday. So feel free to check out who’s next.
Thanks for stopping in, I hope you enjoy the read! All of my other Ikésen works can be found on my Master List, feel free to drop by anytime.
A super big shout out and thank you to @naiyabladesinger​ for all the beta work! Fixing my run on sentences is a monster task!
Also tagging @little-mini-me-world​.
Without further ado, I present. Nobunaga!
Baggage Claim - Nobunaga
“Hey, (YN), are you about ready?” Nobunaga called from the bottom of the stairs.
“Yea! Just gotta get this last suitcase zipped and we’re good to go!”
You heard the familiar thumping of his heavy feet as he walked up the stairs in your home. You hummed to yourself knowing he would be up to check on you shortly. Before you knew it, there was a creak in the wooden floorboards letting you know that he was just beyond the doorway.
“Can I help you with that?” he stepped in holding the suitcase closed just long enough that you were able to get it zipped.
“Mhh, thank you very much!” you beamed at him.
“Is this really all we’re bringing? I’m impressed you managed to fit things for both of us into a single suitcase.” he paused eyeballing it “Though...it did barely fit.”
“I can’t help it...baggage claim is expensive”
“I told you I’d cover the cost, besides, you’re going to get charged for being above the weight limit one of these days.”
“Nope, I’m a wizard I tell you! A wizard.” he chuckled and pulled you in by your waist.
“Whatever you say princess, it’s your birthday trip.” leaning down to share a light kiss with you before breaking away and sweeping your luggage off the bed.
“Shall we? Hideyoshi’s already here.”
“I mean, that definitely sounds like him, but why? We don’t have to be at the airport for another hour, and it only takes twenty minutes to get there…” He shrugged as you headed downstairs stairs together.
---
Tickets in hand you navigated the airport. True to form Hideyoshi had dropped you off way too early, meaning you now had about forty minutes to kill before boarding even started. The both of you wasted as much time as possible in the duty-free stores before giving up and munching on snacks by your gate.
With only thirty minutes until take-off, boarding began. You now stood in an egregiously long queue, single suitcase in hand. The flight attendants stopping you just before you were able to slide past them. Damn.
“Excuse me miss, we have to make sure that bag will fit in the overhead compartment.” She offered her hands to take the luggage from you as Nobunaga looked on smugly.
“Of course.”
She hoisted the baggage into a plastic container that you knew had to be too small to be considered the same size as the overhead bin. Pressing it in, the black suitcase locked snuggly into place as the stewardess and her co-worker looked on in awe.
“Everything checks out” she handed you back the luggage, surprise obvious on her face. “Please enjoy the flight.”
Nobunaga cocked an eyebrow at you before you giggled walking onto the plane.
---
It had been a pleasant three-hour flight and you stepped off the plane into the bright terminal in Ishigaki. You stretched your arms high above your head, standing off to the side as you did so, waiting for Nobunaga to disembark.
“I will forever be impressed with your ability to make this much luggage look like carry on.” he grunted placing the suitcase on the ground to lift the handle so it could be rolled the rest of the way through the airport.
“What did I tell you...I’m a wizard.” he merely responded with a chuckle.
---
You jumped into the back of a cab and headed towards the beach house. This year for your birthday, Nobunaga had planned an elaborate beach getaway on Yaeyama Island. The mainstay was in a ‘way nicer than you thought necessary’ rental property near Yonehara Beach. He had made plans for you both to go snorkeling, on boat tours, and hiking, as well as visit several historical sights.
The vehicle pulled to a stop in front of a long paved driveway surrounded by trees. The doors to the cab popped open as the driver helped you out. Moving to the back of the cab, he grabbed your suitcase and walked it down to the gated entry. Finally passing it off to Nobunaga. Who until a moment ago, had been busy typing in the combination for the security system.
There was a loud “clink” then the gates began to separate, opening to even more driveway. After about a three minute walk we reached the door of the rectangular, modern white home. Stepping in the door, that very specific beach home smell greeted your nose as your eyes took in the view of the ocean beyond the wall of windows.
Leaving your shoes at the doorway you headed towards the back door, sliding it open to let the gentle sea breeze in. You turned, hair curling around your face caught in the soft wind, and to your surprise found Nobunaga right behind you smiling gently. Gracefully, he tucked several loose strands behind your ear before planting a kiss on you temple.
“Happy Birthday (YN)” with tender eyes and a smile that melted your heart he wrapped you up in his arms.
This was going to be a very good trip.
38 notes · View notes
longamazing · 3 years ago
Text
Macos sierra install issues
Tumblr media
#Macos sierra install issues mac os
#Macos sierra install issues install
#Macos sierra install issues update
#Macos sierra install issues software
Here are all the new features coming to MacOS Sierra.
Everything you need to know about MacOS Sierra.
With Time Machine, Apple couldn't make it any easier to create a backup.
#Macos sierra install issues software
Now, here's the part where we remind you again about the potential dangers of using beta software and the importance of backing up your Mac before installing Sierra (Apple will do the same this when you arrive at its Beta Software Program page). The process takes only a minute or two and requires your Apple ID. You will need to sign up to take part in the program, if you haven't already. With your backup Mac or partition ready, head to the Apple Beta Software Program site. Click Apply and wait a minute or two for the new partition to be created. You can leave the Format as OS X Extended (Journaled).ĥ. Choose a size for the new partition by dragging to resize a wedge of the pie chart that represents your hard drive (MacOS Sierra is only 4.86GB) and give it a name. Click the " +" button below the Partition Layout diagram.Ĥ. Select the disk you'd like to partition from from the left panel and then click the Partition button.ģ. It's easy to accomplish in a few easy steps:Ģ. I don't have an extra Mac lying around, so I created a partition for MacOS Sierra on my MacBook Pro.
#Macos sierra install issues install
If you can't wait, I suggest you install the beta on a secondary Mac if you have one or, failing that, on a separate partition on your primary Mac.
Select Reinstall OS X and click on the Continuebutton.First, a disclaimer: As with any beta software, you may run into some issues and odd behaviors with MacOS Sierra that should have you thinking twice about jumping in now instead of waiting for the final release to arrive this fall.
Quit Disk Utility and return to the Utility Menu.
Click on the Apply button, then wait for the Done button to activate and click on it.
#Macos sierra install issues mac os
Set the Format type to Mac OS Extended (Journaled.).Click on the Erase icon in Disk Utility's toolbar.When Disk Utility loads select the drive (out-dented entry) from the Device list.Select Disk Utility from the Utility Menu and click on Continue button.Immediately after the chime hold down the Commandand Rkeys until the Apple logo appears. Erase and Install OS X Restart the computer.When the Utility Menu appears select Reinstall OS X then click on the Continue button. Reinstall OS X by booting from the Recovery HD using the Command and R keys.
#Macos sierra install issues update
Install Combo Updater Download macOS Sierra 10.12.3 Combo Update and install.
If your problems cease, then consider switching to the new account and transferring your files to it - Transferring files from one User Account to another. Upon completion log out of your current account then log into the new account. On the left under Current User click on the Add button below Login Options. Click on the lock icon and enter your Admin password when prompted.
Create a New User Account Open Users & Groups preferences.
Restart the computer from the Apple Menu. Quit Disk Utility and returnto the Utility Menu. Click on the First Aid button in the toolbar. Select the indented (usually, Macintosh HD) volumeentry from the side list. Choose Disk Utility and click on the Continue button. Immediately after the chime hold down the Command and R keys until the Utility Menu appears.
Repair the disk by booting the from the Recovery HD.
Start the computer in Safe Mode, then restart normally.
Reset the System Management Controller (SMC).
You should try each, one at a time, then test to see if the problem is fixed before going on to the next.īe sure to backup your files before proceeding if possible. Possible Fixes for El Capitan and Later Installations
Tumblr media
0 notes
welcome-to-junktown · 7 years ago
Photo
Tumblr media
Adopt-a-Thon Information and Guidelines
Unveiling/Starting Time: July 1st 2018 @ 12:00PM Central Standard Time (1 per minute until all are posted)
Entry Deadline: July 30, 2018 @ 11:59PM Central Standard Time
Who can enter: anyone 16 or older, whether or not you are affiliated with JunkTown. We ask that you join the group with your character if you win them, but you can also use them for AU’s other than JunkTown. 
This post will be reblogged after the unveiling as well for easy access.
(Info and Guidelines below the cut)
How the event will work:
Each character will have their watermarked ID posted on @welcome-to-junktown as a separate blog post, available for viewing any time.
Below each ID will be the tags you should use to hashtag your entries.
You can post your entry any time before the deadline.
You may edit your entry any time before the deadline (please let @kelly-scribes​ know if you do, so I can be absolutely sure I have your best version on file, and so the most recent version can be reblogged to the hub blog).
Entries will not be accepted the moment the clock strikes midnight on July 31st, 2018
Judging officially begins July 31st
Winners will be announced no later than August 7, 2018
If you have won, you will be tagged in the winner’s circle post, and you will be privately messaged by admin Clickspring to receive the downloads of your character’s files.
How to Enter:
Following the guidelines below, inspired by one of the character IDs,create your entry.
Upload your entry to Tumblr and/or DeviantART.
In the artist comments make sure to state that the piece is your official entry, and which character you are competing for. Linking to said character’s blog post is appreciated, but not mandatory.
Tag @welcome-to-junktown if you are posting on Tumblr. You can also tag @kelly-scribes if you want me to find your entry faster.
Tag ( :iconwelcome-to-junktown: ) if you are posting to DeviantART
Hashtag the entry as #welcome to junktown (or) #welcome-to-junktown | #adopt-a-thon2018 | #(character’s name)  (This will be in the description and tags of your character’s blog post to help everyone remember)
Untagged entries will not be accepted, the tagging will help me and my guest judges with entry navigation during judging. If you do not tag, we will not see your entry when browsing the appropriate category, therefore it is as if you didn’t enter at all.
You may make changes to your entry until the deadline. At the deadline time your entry will be catalogued in its current state for final judging.
Guidelines:
You must follow JunkTown Canon and Rules in your entry, any non-canon entries will be automatically disqualified.
You may not make significant changes to the character until you have won them (small things like clothing changes are okay).
You may compete for more than one character,  but for the sake of fairness, you may only win one (1) adopt.
You may enter up to two (2) entries for judge consideration on the character of your choice. Entries may be written, drawn digitally, or drawn traditionally.
Your entry should somehow demonstrate your take on the character you are trying for. Show me in your style, either written and/or drawn,  how you feel they would be. The scenario you draw or write is entirely your choice. Basically, show me what you would do with the character if it was yours. I have left open ended traits and situations in each ID card for you to interpret as you please.
Written entries must be a minimum of 500 words.
Drawn entries must be finished products, traditional entries should not be drawn on lined paper.
There will be no deadline extensions. I have offered an early entry option for several weeks, and have advertised thoroughly.  Any adopts with no entries will be withdrawn and available for sale after the deadline.
What you can win:
You will win the unwatermarked, HD png file of your character’s ID Card.
The full body image from the ID, uncropped and in full high resolution, with and without a basic background.
Copyright to the character you have won to build on as your own.
Questions? Contact admin Clickspring –> @kelly-scribes
25 notes · View notes
12-3amproductions · 7 years ago
Text
Paranormal Experience while Camping
Audrey
Hi guys! Love the blog.
I have a brother who is a couple of years older than me. We’ve always been really close, his name is Danny and we love to go camping together whenever we can, despite the way bizarre and creepy things ALWAYS seem to follow us around. Sometimes we’ll rent a log cabin on a lake somewhere for our vacations together, but we’re both outdoorsy types so we usually elect to go hiking or fishing and set up tents somewhere instead.
Last fall, in early October, we did exactly this and made our way out to this gorgeous sprawl of forest in New England to spend a few days nature walking and making sausages over a fire and listening to podcasts like yours, it’s sort of how we bond now that we’re both adults and have separate lives that seem to be drifting further and further apart a little more every year.
Things were going great, the weather was perfect and the fishing was good, we were having a blast just hiking and taking pictures and talking all day. We set up our tent and built a fire and settled in for the night, drinking beers and lying around until about midnight. Danny seemed perfectly fine, and we’d brought our huge-ass tent that’s technically made for like 6 people, so there was no jostling for space for our sleeping bags or anything. I was out ten minutes after we laid down, thanks to the beer and all the hiking earlier, plus the haunting calls of the odd loon or two that hadn’t yet migrated for the winter. They’ve always been really soothing to me, and once I heard Danny mumble, “night,” I was down for the count. He sounded as tired as I was, so I was planning on both of us sleeping in tomorrow morning. Usually we’re both early risers and would try to beat each other to making the coffee and hash over the fire for breakfast, but I felt weirdly exhausted that night for some reason.
This was all why it struck me as really weird when I sort of-kind of woke up in the middle of the night to find Danny’s sleeping bag flat and him gone, but I assumed he had to piss or something and didn’t think twice about it before passing out again. I hadn’t even heard him rustling around the tent, but I figured I must have slept through it and only his absence had eventually woken me. I slept for a few more minutes, but then I was abruptly woken again by the sound of Danny’s footsteps just outside the tent and weirdly, one of his hands pressing into it, creating an outline shape of it against the canvas. I said, “Danny?“
For a long minute, Danny didn’t answer. It looked like he was dragging his one hand across the surface of the tent for some reason, pressing into it like he was looking for a weak spot or something. My brother is very tall, about six-five, so his hand was higher up than a person closer to my size might have been. That was my only indication that it was him, until he finally said, "Audrey.” That was it, just my name, and I was becoming increasingly creeped out at this point. It was pitch black outside and everything was bizarrely silent, which any campers who might see or hear this will know is HIGHLY suspect for a forest in early autumn, or any time of year for that matter. There were no bugs, no birds calling, no trees rustling, nothing. And that was when it hit me, and I felt like I’d been doused in ice water.
My brother hasn’t called me by my name in years, if he EVER has. Ever since we were little kids, since I was a baby really, he’s called me “sissy” because when our parents first brought him home and explained that this was his new sister, he couldn’t really work the word out and he kept saying “sisser” and “sissy” and they thought it was cute so after a while I was Sissy at home. We were born in the south, so this is a fairly common thing where we come from. He calls me Sissy when he texts me, when he calls me, when he messages me on facebook. He calls me Sissy when we’re hanging out, when he’s referring to me in any way, even when he’s talking to his friends about me; that’s sissy, my sissy’s coming with us tonight, etc. I can’t remember the last time he’s ever said my name out loud, there is literally no reason he’d randomly be using it now, in the middle of the night in the woods.
It occurred to me in that moment that whatever or whoever the hell was standing outside the tent right then, it wasn’t my brother. I didn’t know what else to do though, so I said “Danny, what are you doing?”
“Come on out,” he said, instead of answering me. “It’s beautiful out here, come look at the stars.”
“I don’t want to,” I remember blurting, before realizing how weird that sounded. But what he said next sounded even weirder.
“Audrey, come on out,” he said, and I nearly shit myself when I heard it, because not only was he dragging out the last word in this incredibly creepy singsong tone, his voice had also changed. At first, he’d sounded like Danny, but on that last word, his voice went raw and guttural and harsh, like he was straining to get it out through a throat packed with sand and at least an octave deeper than he’d sounded before. By now I’d scrambled out of my sleeping bag and was up against the opposite side of the tent, and I’d grabbed for my glasses so I could see better, but I wish I hadn’t because I’m pretty sure whatever the hell was outside our tent had seven fingers on the hand it had pressed against the canvas? I was terrified that something had happened to my brother, but like a coward I stayed silent and waited until whoever or whatever was outside seemed to give up and walked away. Its footsteps didn’t sound like Danny’s boots anymore either, but rather a heavier, scraping walk that dragged through the dirt and leaves far more slowly than Danny walks.
Once I was sure it was gone and the birds and bugs started making noises again, I bolted from the tent to find Danny. He wasn’t far away, wandering through a patch of trees calling for me - Sissy, this time. I asked him what the hell had happened and he demanded to know the same thing. He told me that he’d woken up to the sound of me calling him from the woods, asking him to come help me. I told him the whole story from my end, and he was like “Nope. We’re out. Pack up your stuff, I’ll fire up the truck.” Neither of us is a superstitious type by nature, but there was just no denying the absolute madness of what we’d both just experienced. We hit town by dawn, and to this day neither of us can explain that night.
There’s tons more where this came from, weird stuff has been following my brother and I around since we were kids if anyone is interested!
Admins: Sounds like a case of mimic. Evil or playful spirits could have lured people using voice they just copied. Problem is, you are the favourite one compared to your Brother. Great story! Thanks for the submission!
Want to send us your stories?
Feel free to send us your stories in with the title, your name or blog (you can choose to be anonymous), occupation, gender and age.
Your entries must be horror related. Best to be from your own personal horror experience. Thank you for your support!
3 notes · View notes
welovekpopscenarios · 8 years ago
Text
Lackadaisical (Jooheon x Reader)
Tumblr media
 Admin: Mimi
Prompt/Ask: Fluffy and smutty (but mostly fluffy) Jooheon request? Thank you! I love your blog, you're so good to us by writing for us 😭❤️ thank you
Fandom: Monsta X
Genre: Fluff, slight smut?/lime
Pairing: Jooehon x Reader
Warnings: Slightly NSFW at the end
Word Count: 1056
Authors Note: I’m so sorry this took forever, college has been my sole focus lately and I’m trying to get back into writing again. Thank you for the kind words, you’re too sweet to us, I love writing for you all! ALSO THIS WASN’T SMUTTY AT ALL AND IT’S KINDA SHORT IMO AND I’M SORRY FOR THAT FEEL FREE TO COMPLAIN TO ME. Other than that mess, I hope you like this, thank you for the request and happy reading!
“I’m not leaving this bed.”
You looked down to your right to the source of the voice to find Jooheon lying face down on the bed, head lost in the cushiony pillow as the early morning sun streamed in from the cracks in the blinds, a warm, honey-like glow shining over his bare back. You gave a small sigh at his childishness.
“Well, we have to. Even if it’s our day off, we still have adulting to do,” you informed, groaning quietly at the thought of having to clean and cook and do other jobs. Jooheon challenged your quiet groan with his own loud one into the fabric of his pillow that he hugged closer to him.
“Adulting is dumb. I want to sleep in today. And I want to cuddle you. So let’s do it,” he whined, a hand reaching out blindly to touch you. It found your knee and started squeezing, making you laugh at the ticklish feeling. Moving your leg out of reach, you yawned into your hand.
“No, Jooheon. We have responsibilities as grownups,” you tried to reason but he really wasn’t having any of it today. He turned his head slightly to peek a dark eye out at you, the beginnings of a pout forming on his face from what you could see.
“Grown-ups, shmown ups,” he returned immaturely, and you snorted in amusement. “It’s rare we both have a day off, and I just want to stay with you all day in bed. C’mon, sounds better than…I don’t know…taxes, or whatever,” he mumbled into the pillow, eyeing the blinds dourly as more light started to stream in, the early morning sun making its presence known.
You hummed in agreement. “Yeah, it definitely sounds better. But you know, we have to survive. So, we need to get up, pay bills, buy food, blah blah blah. So c’mon, lazy butt, get your perfect booty out of this bed and make a living.”
He flushed at your comment and hid his grin into the cotton fabric, muffling his sleepy giggles. You laughed at him, eyes crinkling in the corners, watching his back shake from laughter. Taking a hold of the nearest hand to you, you attempted to drag him out of bed, and his laughter soon turned into overdramatic groans as you started to slide his body towards the edge of the bed, inch by inch. Just when you thought you had him at the brink of falling off, he suddenly reached his arms out and caught you, flinging you to the bed underneath him in a mess of laughter and shrieks. He pinned you underneath him, smothering your face in quick little kisses, pulling back after a moment to let you breathe. He stared down at you with that gorgeous smile of his, dimples fully on display just for you. You poked one with your finger, and he scrunched his nose up at the action.
“Remember when we used to do this all the time? When we’d sleep in, and spend the day watching all the episodes to whatever anime we were watching at the time?” he murmured, shifting to lie on his side next to you, wrapping an arm around your midsection and pulling you close to his toned body.
“Yeah, I loved those days,” you said quietly, reminiscing on the memories shared with Jooheon when you were both young, teenagers approaching adulthood and experiencing the joys of puberty, school and peer pressure. You remember the days when you’d both relax in his room, his red curtains drawn and casting a maroon hue throughout the cluttered space as you both lay hidden underneath his blankets and sheets, a movie playing in the background as you’d both get lost in between kisses and sweet touches. A smile graced your lips as you thought of this, a small ache in your chest as you realised those days of youth were gone, and the real world was a lot crueller than you had thought. “We’re not teenagers anymore though. Things were a lot easier before you became an idol and before I started working,” you mused sadly, and Jooheon frowned beside you, squeezing you that bit tighter.
“Which is exactly why we should make use of today, a rare day we both have off, and just spend the day together. I miss you, and I don’t want to leave you today,” he whined, biting at the corner of his lip. You looked at him for a moment, contemplating your options. One day couldn’t hurt, and you really missed him too.
Adulting can wait until tomorrow.
“I’m picking the movie, and you can make the food. But promise me we’ll at least get some shopping done later tonight,” you reasoned, and Jooheon was speechless for a moment, before a huge grin overtook his visage and his eyes were lost behind his lids, squinting from happiness. He placed kisses all over your face until he finally reached your lips, giving you one long, hard kiss that left you gasping for air and amazingly delirious. Separating momentarily to stare into your eyes, he pressed another kiss to your lips, a kiss more heated and serious than the last, and the cheerful atmosphere in the room disappeared.
His tongue traced the seam of your lips and you granted him entry willingly, his tongue distracting you from the hands wandering underneath your shirt, his fingers tickling your skin. Trailing his kisses along your jaw and down your neck, your chest heaved as your body became charged with desire, reaching your hands up to thread them through his hair. His body shifted above yours, and with the movement his hips slid against yours ever so slightly, yet you both moaned in unison at the friction it caused. Forcing your brain to start working again, you tried speaking, which was hard when Jooheon was nipping at your collarbone.
“What happened to watching movies?” you whispered airily, sighing when he sucked at a sweet spot. Leaving a mark, he leaned back and admired it before answering you.
“We can watch movies in a while,” he mumbled distractedly, too busy lifting the blankets over you both and shielding you from the world. “I have more important things right now.”
It’s safe to say, you didn’t leave that bed for a long while.
286 notes · View notes
suzanneshannon · 5 years ago
Text
Roll Your Own Comments With Gatsby and FaunaDB
If you haven’t used Gatsby before have a read about why it’s fast in every way that matters, and if you haven’t used FaunaDB before you’re in for a treat. If you’re looking to make your static sites full blown Jamstack applications this is the back end solution for you!
This tutorial will only focus on the operations you need to use FaunaDB to power a comment system for a Gatsby blog. The app comes complete with inputs fields that allow users to comment on your posts and an admin area for you to approve or delete comments before they appear on each post. Authentication is provided by Netlify’s Identity widget and it’s all sewn together using Netlify serverless functions and an Apollo/GraphQL API that pushes data up to a FaunaDB database collection.
Tumblr media
I chose FaunaDB for the database for a number of reasons. Firstly there’s a very generous free tier! perfect for those small projects that need a back end, there’s native support for GraphQL queries and it has some really powerful indexing features!
…and to quote the creators;
No matter which stack you use, or where you’re deploying your app, FaunaDB gives you effortless, low-latency and reliable access to your data via APIs familiar to you
You can see the finished comments app here.
Get Started
To get started clone the repo at https://github.com/PaulieScanlon/fauna-gatsby-comments
or:
git clone https://github.com/PaulieScanlon/fauna-gatsby-comments.git
Then install all the dependencies:
npm install
Also cd in to functions/apollo-graphql and install the dependencies for the Netlify function:
npm install
This is a separate package and has its own dependencies, you’ll be using this later.
We also need to install the Netlify CLI as you’ll also use this later:
npm install netlify-cli -g
Now lets add three new files that aren’t part of the repo.
At the root of your project create a .env .env.development and .env.production
Add the following to .env:
GATSBY_FAUNA_DB = GATSBY_FAUNA_COLLECTION =
Add the following to .env.development:
GATSBY_FAUNA_DB = GATSBY_FAUNA_COLLECTION = GATSBY_SHOW_SIGN_UP = true GATSBY_ADMIN_ID =
Add the following to .env.production:
GATSBY_FAUNA_DB = GATSBY_FAUNA_COLLECTION = GATSBY_SHOW_SIGN_UP = false GATSBY_ADMIN_ID =
You’ll come back to these later but in case you’re wondering
GATSBY_FAUNA_DB is the FaunaDB secret key for your database
GATSBY_FAUNA_COLLECTION is the FaunaDB collection name
GATSBY_SHOW_SIGN_UP is used to hide the Sign up button when the site is in production
GATSBY_ADMIN_ID is a user id that Netlify Identity will generate for you
If you’re the curious type you can get a taster of the app by running gatsby develop or yarn develop and then navigate to http://localhost:8000 in your browser.
FaunaDB
So Let’s get cracking, but before we write any operations head over to https://fauna.com/ and sign up!
Database and Collection
Create a new database by clicking NEW DATABASE
Name the database: I’ve called the demo database fauna-gatsby-comments
Create a new Collection by clicking NEW COLLECTION
Name the collection: I’ve called the demo collection demo-blog-comments
Tumblr media
Server Key
Now you’ll need to to set up a server key. Go to SECURITY
Create a new key by clicking NEW KEY
Select the database you want the key to apply to, fauna-gatsby-comments for example
Set the Role as Admin
Name the server key: I’ve called the demo key demo-blog-server-key
Tumblr media
Environment Variables Pt. 1
Copy the server key and add it to GATSBY_FAUNA_DB in .env.development, .env.production and .env.
You’ll also need to add the name of the collection to GATSBY_FAUNA_COLLECTION in .env.development, .env.production and .env.
Adding these values to .env are just so you can test your development FaunaDB operations, which you’ll do next.
Let’s start by creating a comment so head back to boop.js:
// boop.js ... // CREATE COMMENT createComment: async () => { const slug = "/posts/some-post" const name = "some name" const comment = "some comment" const results = await client.query( q.Create(q.Collection(COLLECTION_NAME), { data: { isApproved: false, slug: slug, date: new Date().toString(), name: name, comment: comment, }, }) ) console.log(JSON.stringify(results, null, 2)) return { commentId: results.ref.id, } }, ...
The breakdown of this function is as follows;
q is the instance of faunadb.query
Create is the FaunaDB method to create an entry within a collection
Collection is area in the database to store the data. It takes the name of the collection as the first argument and a data object as the second.
The second argument is the shape of the data you need to drive the applications comment system.
For now you’re going to hard-code slug, name and comment but in the final app these values are captured by the input form on the posts page and passed in via args
The breakdown for the shape is as follows;
isApproved is the status of the comment and by default it’s false until we approve it in the Admin page
slug is the path to the post where the comment was written
date is the time stamp the comment was written
name is the name the user entered in the comments from
comment is the comment the user entered in the comments form
When you (or a user) creates a comment you’re not really interested in dealing with the response because as far as the user is concerned all they’ll see is either a success or error message.
After a user has posted a comment it will go in to your Admin queue until you approve it but if you did want to return something you could surface this in the UI by returning something from the createComment function.
Create a comment
If you’ve hard coded a slug, name and comment you can now run the following in your CLI
node boop createComment
If everything worked correctly you should see a log in your terminal of the new comment.
{ "ref": { "@ref": { "id": "263413122555970050", "collection": { "@ref": { "id": "demo-blog-comments", "collection": { "@ref": { "id": "collections" } } } } } }, "ts": 1587469179600000, "data": { "isApproved": false, "slug": "/posts/some-post", "date": "Tue Apr 21 2020 12:39:39 GMT+0100 (British Summer Time)", "name": "some name", "comment": "some comment" } } { commentId: '263413122555970050' }
If you head over to COLLECTIONS in FaunaDB you should see your new entry in the collection.
Tumblr media
You’ll need to create a few more comments while in development so change the hard-coded values for name and comment and run the following again.
node boop createComment
Do this a few times so you end up with at least three new comments stored in the database, you’ll use these in a moment.
Delete comment by id
Now that you can create comments you’ll also need to be able to delete a comment.
By adding the commentId of one of the comments you created above you can delete it from the database. The commentId is the id in the ref.@ref object
Again you’re not really concerned with the return value here but if you wanted to surface this in the UI you could do so by returning something from the deleteCommentById function.
// boop.js ... // DELETE COMMENT deleteCommentById: async () => { const commentId = "263413122555970050"; const results = await client.query( q.Delete(q.Ref(q.Collection(COLLECTION_NAME), commentId)) ); console.log(JSON.stringify(results, null, 2)); return { commentId: results.ref.id, }; }, ...
The breakdown of this function is as follows
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Delete is the FaunaDB delete method to delete entries from a collection
Ref is the unique FaunaDB ref used to identify the entry
Collection is area in the database where the data is stored
If you’ve hard coded a commentId you can now run the following in your CLI:
node boop deleteCommentById
If you head back over to COLLECTIONS in FaunaDB you should see that entry no longer exists in collection
Indexes
Next you’re going to create an INDEX in FaunaDB.
An INDEX allows you to query the database with a specific term and define a specific data shape to return.
When working with GraphQL and / or TypeScript this is really powerful because you can use FaunaDB indexes to return only the data you need and in a predictable shape. This makes data typing responses in GraphQL and / TypeScript a dream… I’ve worked on a number of applications that just return a massive object of useless values which will inevitably cause bugs in your app. blurg!
Tumblr media
Go to INDEXES and click NEW INDEX
Name the index: I’ve called this one get-all-comments
Set the source collection to the name of the collection you setup earlier
As mentioned above when you query the database using this index you can tell FaunaDB which parts of the entry you want to return.
You can do this by adding “values” but be careful to enter the values exactly as they appear below because (on the FaunaDB free tier) you can’t amend these after you’ve created them so if there’s a mistake you’ll have to delete the index and start again… bummer!
The values you need to add are as follows:
ref
data.isApproved
data.slug
data.date
data.name
data.comment
After you’ve added all the values you can click SAVE.
Get all comments
// boop.js ... // GET ALL COMMENTS getAllComments: async () => { const results = await client.query( q.Paginate(q.Match(q.Index("get-all-comments"))) ); console.log(JSON.stringify(results, null, 2)); return results.data.map(([ref, isApproved, slug, date, name, comment]) => ({ commentId: ref.id, isApproved, slug, date, name, comment, })); }, ...
The breakdown of this function is as follows
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Paginate paginates the responses
Match returns matched results
Index is the name of the Index you just created
The shape of the returned result here is an array of the same shape you defined in the Index “values”
If you run the following you should see the list of all the comments you created earlier:
node boop getAllComments
Get comments by slug
You’re going to take a similar approach as above but this time create a new Index that allows you to query FaunaDB in a different way. The key difference here is that when you get-comments-by-slug you’ll need to tell FaunaDB about this specific term and you can do this by adding data.slug to the Terms field.
Tumblr media
Go to INDEX and click NEW INDEX
Name the index, I’ve called this one get-comments-by-slug
Set the source collection to the name of the collection you setup earlier
Add data.slug in the terms field
The values you need to add are as follows:
ref
data.isApproved
data.slug
data.date
data.name
data.comment
After you’ve added all the values you can click SAVE.
// boop.js ... // GET COMMENT BY SLUG getCommentsBySlug: async () => { const slug = "/posts/some-post"; const results = await client.query( q.Paginate(q.Match(q.Index("get-comments-by-slug"), slug)) ); console.log(JSON.stringify(results, null, 2)); return results.data.map(([ref, isApproved, slug, date, name, comment]) => ({ commentId: ref.id, isApproved, slug, date, name, comment, })); }, ...
The breakdown of this function is as follows:
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Paginate paginates the responses
Match returns matched results
Index is the name of the Index you just created
The shape of the returned result here is an array of the same shape you defined in the Index “values” you can create this shape in the same way you did above and be sure to add a value for terms. Again be careful to enter these with care.
If you run the following you should see the list of all the comments you created earlier but for a specific slug:
node boop getCommentsBySlug
Approve comment by id
When you create a comment you manually set the isApproved value to false. This prevents the comment from being shown in the app until you approve it.
You’ll now need to create a function to do this but you’ll need to hard-code a commentId. Use a commentId from one of the comments you created earlier:
// boop.js ... // APPROVE COMMENT BY ID approveCommentById: async () => { const commentId = '263413122555970050' const results = await client.query( q.Update(q.Ref(q.Collection(COLLECTION_NAME), commentId), { data: { isApproved: true, }, }) ); console.log(JSON.stringify(results, null, 2)); return { isApproved: results.isApproved, }; }, ...
The breakdown of this function is as follows:
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Update is the FaundaDB method up update an entry
Ref is the unique FaunaDB ref used to identify the entry
Collection is area in the database where the data is stored
If you’ve hard coded a commentId you can now run the following in your CLI:
node boop approveCommentById
If you run the getCommentsBySlug again you should now see the isApproved status of the entry you hard-coded the commentId for will have changed to true.
node boop getCommentsBySlug
These are all the operations required to manage the data from the app.
In the repo if you have a look at apollo-graphql.js which can be found in functions/apollo-graphql you’ll see the all of the above operations. As mentioned before the hard-coded values are replaced by args, these are the values passed in from various parts of the app.
Netlify
Assuming you’ve completed the Netlify sign up process or already have an account with Netlify you can now push the demo app to your GitHub account.
To do this you’ll need to have initialize git locally, added a remote and have pushed the demo repo upstream before proceeding.
You should now be able to link the repo up to Netlify’s Continuous Deployment.
If you click the “New site from Git” button on the Netlify dashboard you can authorize access to your GitHub account and select the gatsby-fauna-comments repo to enable Netlify’s Continuous Deployment. You’ll need to have deployed at least once so that we have a pubic URL of your app.
The URL will look something like this https://ecstatic-lewin-b1bd17.netlify.app but feel free to rename it and make a note of the URL as you’ll need it for the Netlify Identity step mentioned shortly.
Tumblr media
Environment Variables Pt. 2
In a previous step you added the FaunaDB database secret key and collection name to your .env files(s). You’ll also need to add the same to Netlify’s Environment variables.
Navigate to Settings from the Netlify navigation
Click on Build and deploy
Either select Environment or scroll down until you see Environment variables
Click on Edit variables
Proceed to add the following:
GATSBY_SHOW_SIGN_UP = false GATSBY_FAUNA_DB = you FaunaDB secret key GATSBY_FAUNA_COLLECTION = you FaunaDB collection name
While you’re here you’ll also need to amend the Sensitive variable policy, select Deploy without restrictions
Netlify Identity Widget
I mentioned before that when a comment is created the isApproved value is set to false, this prevents comments from appearing on blog posts until you (the admin) have approved them. In order to become admin you’ll need to create an identity.
You can achieve this by using the Netlify Identity Widget.
If you’ve completed the Continuous Deployment step above you can navigate to the Identity page from the Netlify navigation.
Tumblr media
You wont see any users in here just yet so lets use the app to connect the dots, but before you do that make sure you click Enable Identity
Before you continue I just want to point out you’ll be using netlify dev instead of gatsby develop or yarn develop from now on. This is because you’ll be using some “special” Netlify methods in the app and staring the server using netlify dev is required to spin up various processes you’ll be using.
Spin up the app using netlify dev
Navigate to http://localhost:8888/admin/
Click the Sign Up button in the header
You will also need to point the Netlify Identity widget at your newly deployed app URL. This was the URL I mentioned you’ll need to make a note of earlier, if you’ve not renamed your app it’ll look something like this https://ecstatic-lewin-b1bd17.netlify.app/ There will be a prompt in the pop up window to Set site’s URL.
You can now complete the necessary sign up steps.
After sign up you’ll get an email asking you to confirm you identity and once that’s completed refresh the Identity page in Netlify and you should see yourself as a user.
It’s now login time, but before you do this find Identity.js in src/components and temporarily un-comment the console.log() on line 14. This will log the Netlify Identity user object to the console.
Restart your local server
Spin up the app again using netlify dev
Click the Login button in the header
If this all works you should be able to see a console log for netlifyIdentity.currentUser: find the id key and copy the value.
Set this as the value for GATSBY_ADMIN_ID = in both .env.production and .env.development
You can now safely remove the console.log() on line 14 in Identity.js or just comment it out again.
GATSBY_ADMIN_ID = your Netlify Identity user id
…and finally
Restart your local server
Spin up the app again using netlify dev
Now you should be able to login as “Admin”… hooray!
Navigate to http://localhost:8888/admin/ and Login.
It’s important to note here you’ll be using localhost:8888 for development now and NOT localhost:8000 which is more common with Gatsby development
Before you test this in the deployed environment make sure you go back to Netlify’s Environment variables and add your Netlify Identity user id to the Environment variables!
Navigate to Settings from the Netlify navigation
Click on Build and deploy
Either select Environment or scroll down until you see Environment variables
Click on Edit variables
Proceed to add the following:
GATSBY_ADMIN_ID = your Netlify Identity user id
If you have a play around with the app and enter a few comments on each of the posts then navigate back to Admin page you can choose to either approve or delete the comments.
Naturally only approved comments will be displayed on any given post and deleted ones are gone forever.
If you’ve used this tutorial for your project I’d love to hear from you at @pauliescanlon.
By Paulie Scanlon (@pauliescanlon), Front End React UI Developer / UX Engineer: After all is said and done, structure + order = fun.
Visit Paulie’s Blog at: www.paulie.dev
The post Roll Your Own Comments With Gatsby and FaunaDB appeared first on CSS-Tricks.
Roll Your Own Comments With Gatsby and FaunaDB published first on https://deskbysnafu.tumblr.com/
0 notes
recruitmentdubai · 5 years ago
Text
Roll Your Own Comments With Gatsby and FaunaDB
If you haven’t used Gatsby before have a read about why it’s fast in every way that matters, and if you haven’t used FaunaDB before you’re in for a treat. If you’re looking to make your static sites full blown Jamstack applications this is the back end solution for you!
This tutorial will only focus on the operations you need to use FaunaDB to power a comment system for a Gatsby blog. The app comes complete with inputs fields that allow users to comment on your posts and an admin area for you to approve or delete comments before they appear on each post. Authentication is provided by Netlify’s Identity widget and it’s all sewn together using Netlify serverless functions and an Apollo/GraphQL API that pushes data up to a FaunaDB database collection.
Tumblr media
I chose FaunaDB for the database for a number of reasons. Firstly there’s a very generous free tier! perfect for those small projects that need a back end, there’s native support for GraphQL queries and it has some really powerful indexing features!
…and to quote the creators;
No matter which stack you use, or where you’re deploying your app, FaunaDB gives you effortless, low-latency and reliable access to your data via APIs familiar to you
You can see the finished comments app here.
Get Started
To get started clone the repo at https://github.com/PaulieScanlon/fauna-gatsby-comments
or:
git clone https://github.com/PaulieScanlon/fauna-gatsby-comments.git
Then install all the dependencies:
npm install
Also cd in to functions/apollo-graphql and install the dependencies for the Netlify function:
npm install
This is a separate package and has its own dependencies, you’ll be using this later.
We also need to install the Netlify CLI as you’ll also use this later:
npm install netlify-cli -g
Now lets add three new files that aren’t part of the repo.
At the root of your project create a .env .env.development and .env.production
Add the following to .env:
GATSBY_FAUNA_DB = GATSBY_FAUNA_COLLECTION =
Add the following to .env.development:
GATSBY_FAUNA_DB = GATSBY_FAUNA_COLLECTION = GATSBY_SHOW_SIGN_UP = true GATSBY_ADMIN_ID =
Add the following to .env.production:
GATSBY_FAUNA_DB = GATSBY_FAUNA_COLLECTION = GATSBY_SHOW_SIGN_UP = false GATSBY_ADMIN_ID =
You’ll come back to these later but in case you’re wondering
GATSBY_FAUNA_DB is the FaunaDB secret key for your database
GATSBY_FAUNA_COLLECTION is the FaunaDB collection name
GATSBY_SHOW_SIGN_UP is used to hide the Sign up button when the site is in production
GATSBY_ADMIN_ID is a user id that Netlify Identity will generate for you
If you’re the curious type you can get a taster of the app by running gatsby develop or yarn develop and then navigate to http://localhost:8000 in your browser.
FaunaDB
So Let’s get cracking, but before we write any operations head over to https://fauna.com/ and sign up!
Database and Collection
Create a new database by clicking NEW DATABASE
Name the database: I’ve called the demo database fauna-gatsby-comments
Create a new Collection by clicking NEW COLLECTION
Name the collection: I’ve called the demo collection demo-blog-comments
Tumblr media
Server Key
Now you’ll need to to set up a server key. Go to SECURITY
Create a new key by clicking NEW KEY
Select the database you want the key to apply to, fauna-gatsby-comments for example
Set the Role as Admin
Name the server key: I’ve called the demo key demo-blog-server-key
Tumblr media
Environment Variables Pt. 1
Copy the server key and add it to GATSBY_FAUNA_DB in .env.development, .env.production and .env.
You’ll also need to add the name of the collection to GATSBY_FAUNA_COLLECTION in .env.development, .env.production and .env.
Adding these values to .env are just so you can test your development FaunaDB operations, which you’ll do next.
Let’s start by creating a comment so head back to boop.js:
// boop.js ... // CREATE COMMENT createComment: async () => { const slug = "/posts/some-post" const name = "some name" const comment = "some comment" const results = await client.query( q.Create(q.Collection(COLLECTION_NAME), { data: { isApproved: false, slug: slug, date: new Date().toString(), name: name, comment: comment, }, }) ) console.log(JSON.stringify(results, null, 2)) return { commentId: results.ref.id, } }, ...
The breakdown of this function is as follows;
q is the instance of faunadb.query
Create is the FaunaDB method to create an entry within a collection
Collection is area in the database to store the data. It takes the name of the collection as the first argument and a data object as the second.
The second argument is the shape of the data you need to drive the applications comment system.
For now you’re going to hard-code slug, name and comment but in the final app these values are captured by the input form on the posts page and passed in via args
The breakdown for the shape is as follows;
isApproved is the status of the comment and by default it’s false until we approve it in the Admin page
slug is the path to the post where the comment was written
date is the time stamp the comment was written
name is the name the user entered in the comments from
comment is the comment the user entered in the comments form
When you (or a user) creates a comment you’re not really interested in dealing with the response because as far as the user is concerned all they’ll see is either a success or error message.
After a user has posted a comment it will go in to your Admin queue until you approve it but if you did want to return something you could surface this in the UI by returning something from the createComment function.
Create a comment
If you’ve hard coded a slug, name and comment you can now run the following in your CLI
node boop createComment
If everything worked correctly you should see a log in your terminal of the new comment.
{ "ref": { "@ref": { "id": "263413122555970050", "collection": { "@ref": { "id": "demo-blog-comments", "collection": { "@ref": { "id": "collections" } } } } } }, "ts": 1587469179600000, "data": { "isApproved": false, "slug": "/posts/some-post", "date": "Tue Apr 21 2020 12:39:39 GMT+0100 (British Summer Time)", "name": "some name", "comment": "some comment" } } { commentId: '263413122555970050' }
If you head over to COLLECTIONS in FaunaDB you should see your new entry in the collection.
Tumblr media
You’ll need to create a few more comments while in development so change the hard-coded values for name and comment and run the following again.
node boop createComment
Do this a few times so you end up with at least three new comments stored in the database, you’ll use these in a moment.
Delete comment by id
Now that you can create comments you’ll also need to be able to delete a comment.
By adding the commentId of one of the comments you created above you can delete it from the database. The commentId is the id in the ref.@ref object
Again you’re not really concerned with the return value here but if you wanted to surface this in the UI you could do so by returning something from the deleteCommentById function.
// boop.js ... // DELETE COMMENT deleteCommentById: async () => { const commentId = "263413122555970050"; const results = await client.query( q.Delete(q.Ref(q.Collection(COLLECTION_NAME), commentId)) ); console.log(JSON.stringify(results, null, 2)); return { commentId: results.ref.id, }; }, ...
The breakdown of this function is as follows
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Delete is the FaunaDB delete method to delete entries from a collection
Ref is the unique FaunaDB ref used to identify the entry
Collection is area in the database where the data is stored
If you’ve hard coded a commentId you can now run the following in your CLI:
node boop deleteCommentById
If you head back over to COLLECTIONS in FaunaDB you should see that entry no longer exists in collection
Indexes
Next you’re going to create an INDEX in FaunaDB.
An INDEX allows you to query the database with a specific term and define a specific data shape to return.
When working with GraphQL and / or TypeScript this is really powerful because you can use FaunaDB indexes to return only the data you need and in a predictable shape. This makes data typing responses in GraphQL and / TypeScript a dream… I’ve worked on a number of applications that just return a massive object of useless values which will inevitably cause bugs in your app. blurg!
Tumblr media
Go to INDEXES and click NEW INDEX
Name the index: I’ve called this one get-all-comments
Set the source collection to the name of the collection you setup earlier
As mentioned above when you query the database using this index you can tell FaunaDB which parts of the entry you want to return.
You can do this by adding “values” but be careful to enter the values exactly as they appear below because (on the FaunaDB free tier) you can’t amend these after you’ve created them so if there’s a mistake you’ll have to delete the index and start again… bummer!
The values you need to add are as follows:
ref
data.isApproved
data.slug
data.date
data.name
data.comment
After you’ve added all the values you can click SAVE.
Get all comments
// boop.js ... // GET ALL COMMENTS getAllComments: async () => { const results = await client.query( q.Paginate(q.Match(q.Index("get-all-comments"))) ); console.log(JSON.stringify(results, null, 2)); return results.data.map(([ref, isApproved, slug, date, name, comment]) => ({ commentId: ref.id, isApproved, slug, date, name, comment, })); }, ...
The breakdown of this function is as follows
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Paginate paginates the responses
Match returns matched results
Index is the name of the Index you just created
The shape of the returned result here is an array of the same shape you defined in the Index “values”
If you run the following you should see the list of all the comments you created earlier:
node boop getAllComments
Get comments by slug
You’re going to take a similar approach as above but this time create a new Index that allows you to query FaunaDB in a different way. The key difference here is that when you get-comments-by-slug you’ll need to tell FaunaDB about this specific term and you can do this by adding data.slug to the Terms field.
Tumblr media
Go to INDEX and click NEW INDEX
Name the index, I’ve called this one get-comments-by-slug
Set the source collection to the name of the collection you setup earlier
Add data.slug in the terms field
The values you need to add are as follows:
ref
data.isApproved
data.slug
data.date
data.name
data.comment
After you’ve added all the values you can click SAVE.
// boop.js ... // GET COMMENT BY SLUG getCommentsBySlug: async () => { const slug = "/posts/some-post"; const results = await client.query( q.Paginate(q.Match(q.Index("get-comments-by-slug"), slug)) ); console.log(JSON.stringify(results, null, 2)); return results.data.map(([ref, isApproved, slug, date, name, comment]) => ({ commentId: ref.id, isApproved, slug, date, name, comment, })); }, ...
The breakdown of this function is as follows:
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Paginate paginates the responses
Match returns matched results
Index is the name of the Index you just created
The shape of the returned result here is an array of the same shape you defined in the Index “values” you can create this shape in the same way you did above and be sure to add a value for terms. Again be careful to enter these with care.
If you run the following you should see the list of all the comments you created earlier but for a specific slug:
node boop getCommentsBySlug
Approve comment by id
When you create a comment you manually set the isApproved value to false. This prevents the comment from being shown in the app until you approve it.
You’ll now need to create a function to do this but you’ll need to hard-code a commentId. Use a commentId from one of the comments you created earlier:
// boop.js ... // APPROVE COMMENT BY ID approveCommentById: async () => { const commentId = '263413122555970050' const results = await client.query( q.Update(q.Ref(q.Collection(COLLECTION_NAME), commentId), { data: { isApproved: true, }, }) ); console.log(JSON.stringify(results, null, 2)); return { isApproved: results.isApproved, }; }, ...
The breakdown of this function is as follows:
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Update is the FaundaDB method up update an entry
Ref is the unique FaunaDB ref used to identify the entry
Collection is area in the database where the data is stored
If you’ve hard coded a commentId you can now run the following in your CLI:
node boop approveCommentById
If you run the getCommentsBySlug again you should now see the isApproved status of the entry you hard-coded the commentId for will have changed to true.
node boop getCommentsBySlug
These are all the operations required to manage the data from the app.
In the repo if you have a look at apollo-graphql.js which can be found in functions/apollo-graphql you’ll see the all of the above operations. As mentioned before the hard-coded values are replaced by args, these are the values passed in from various parts of the app.
Netlify
Assuming you’ve completed the Netlify sign up process or already have an account with Netlify you can now push the demo app to your GitHub account.
To do this you’ll need to have initialize git locally, added a remote and have pushed the demo repo upstream before proceeding.
You should now be able to link the repo up to Netlify’s Continuous Deployment.
If you click the “New site from Git” button on the Netlify dashboard you can authorize access to your GitHub account and select the gatsby-fauna-comments repo to enable Netlify’s Continuous Deployment. You’ll need to have deployed at least once so that we have a pubic URL of your app.
The URL will look something like this https://ecstatic-lewin-b1bd17.netlify.app but feel free to rename it and make a note of the URL as you’ll need it for the Netlify Identity step mentioned shortly.
Tumblr media
Environment Variables Pt. 2
In a previous step you added the FaunaDB database secret key and collection name to your .env files(s). You’ll also need to add the same to Netlify’s Environment variables.
Navigate to Settings from the Netlify navigation
Click on Build and deploy
Either select Environment or scroll down until you see Environment variables
Click on Edit variables
Proceed to add the following:
GATSBY_SHOW_SIGN_UP = false GATSBY_FAUNA_DB = you FaunaDB secret key GATSBY_FAUNA_COLLECTION = you FaunaDB collection name
While you’re here you’ll also need to amend the Sensitive variable policy, select Deploy without restrictions
Netlify Identity Widget
I mentioned before that when a comment is created the isApproved value is set to false, this prevents comments from appearing on blog posts until you (the admin) have approved them. In order to become admin you’ll need to create an identity.
You can achieve this by using the Netlify Identity Widget.
If you’ve completed the Continuous Deployment step above you can navigate to the Identity page from the Netlify navigation.
Tumblr media
You wont see any users in here just yet so lets use the app to connect the dots, but before you do that make sure you click Enable Identity
Before you continue I just want to point out you’ll be using netlify dev instead of gatsby develop or yarn develop from now on. This is because you’ll be using some “special” Netlify methods in the app and staring the server using netlify dev is required to spin up various processes you’ll be using.
Spin up the app using netlify dev
Navigate to http://localhost:8888/admin/
Click the Sign Up button in the header
You will also need to point the Netlify Identity widget at your newly deployed app URL. This was the URL I mentioned you’ll need to make a note of earlier, if you’ve not renamed your app it’ll look something like this https://ecstatic-lewin-b1bd17.netlify.app/ There will be a prompt in the pop up window to Set site’s URL.
You can now complete the necessary sign up steps.
After sign up you’ll get an email asking you to confirm you identity and once that’s completed refresh the Identity page in Netlify and you should see yourself as a user.
It’s now login time, but before you do this find Identity.js in src/components and temporarily un-comment the console.log() on line 14. This will log the Netlify Identity user object to the console.
Restart your local server
Spin up the app again using netlify dev
Click the Login button in the header
If this all works you should be able to see a console log for netlifyIdentity.currentUser: find the id key and copy the value.
Set this as the value for GATSBY_ADMIN_ID = in both .env.production and .env.development
You can now safely remove the console.log() on line 14 in Identity.js or just comment it out again.
GATSBY_ADMIN_ID = your Netlify Identity user id
…and finally
Restart your local server
Spin up the app again using netlify dev
Now you should be able to login as “Admin”… hooray!
Navigate to http://localhost:8888/admin/ and Login.
It’s important to note here you’ll be using localhost:8888 for development now and NOT localhost:8000 which is more common with Gatsby development
Before you test this in the deployed environment make sure you go back to Netlify’s Environment variables and add your Netlify Identity user id to the Environment variables!
Navigate to Settings from the Netlify navigation
Click on Build and deploy
Either select Environment or scroll down until you see Environment variables
Click on Edit variables
Proceed to add the following:
GATSBY_ADMIN_ID = your Netlify Identity user id
If you have a play around with the app and enter a few comments on each of the posts then navigate back to Admin page you can choose to either approve or delete the comments.
Naturally only approved comments will be displayed on any given post and deleted ones are gone forever.
If you’ve used this tutorial for your project I’d love to hear from you at @pauliescanlon.
By Paulie Scanlon (@pauliescanlon), Front End React UI Developer / UX Engineer: After all is said and done, structure + order = fun.
Visit Paulie’s Blog at: www.paulie.dev
The post Roll Your Own Comments With Gatsby and FaunaDB appeared first on CSS-Tricks.
source https://css-tricks.com/roll-your-own-comments-with-gatsby-and-faunadb/
from WordPress https://ift.tt/3bQyJZK via IFTTT
0 notes
uci-fanfic-requests · 8 years ago
Note
can you write about the first day on the job? like how the escorts got recruited and the day starting it
Admin Notes: I always thought that the escort were picked up at different times, but to promote your prompt, here’s a story about the six escorts starting their first day as underworld escorts together. Fresh out of… I guess escort academy, good luck to them! -Admin Hirahara
The Gokuto Manor was much bigger than the six had thought it would be, having never visited before now. Kirishima, Saeki, Hirahara, Tagami, Tanizaki, and Kinoshita stood in front of the wooden doors, having just been assigned to this branch by Lord Enma himself. Apparently, the captain in charge (his name was Rokkaku) was known as a kind man, so they shouldn’t be two worried. However, they were told before hand that there was a lot of work to be done, as they were the first group to ever work under him.
“I wonder… what he’ll be like.” Kinoshita laughed, although a bit nervously. Although the six were standing at the door, none of them were knocking. It was Tanizaki who finally stepped up to open the door, tired of everyone else being nervous. With three loud thumps, the six waited for someone to come to the door.
Rather than hearing footsteps, though, they were a little surprised to hear nothing at all. Being that the manor was made of wood, surely they’d hear the captain coming. And yet, rather quickly, the door was opened. Instead of seeing a man, though, the six found themselves facing a woman much shorter than most of them.
“Oh, guests?” She wondered, then, having seen their uniform, smiled. “Oh! You must be the escorts that were assigned here, am I right? Rokkaku-san did say to be on the look out for you!” She ushered them in with a warm laugh, really confusing the escorts. They hadn’t really expected to see anyone else, after all. “My name is Kirika,” she introduced. “But you can call me ‘Auntie’! Rokkaku-san asked me to stay later tonight to prepare something special for you all~”
“Um, Kiri-“ Saeki started, then quickly retracted his statement. “Auntie, where is Rokkaku-san? We haven’t met him yet…”
“Oh, well, he got his coffee and went to his office.” She directed the six down the hallway. “Don’t be so nervous, he’s a good person.” She winked and then hummed as she walked… no, slithered off. The escorts noticed her tail dragging behind her as she moved away. So she’s not an oni, they all thought.
Now that they knew where to go, they found themselves standing in front of Rokkaku’s office. Although clearly marked, the door was closed, and once again, they knocked before announcing their presence. From behind the door, they heard a deep voice ushering them to come in.
Although the office was spacious, there was only one person sitting behind a desk. He had things stacked on his desk, but they were all rather neat and tidy. a gramophone sat next to a type writer on a separate desk, a tall, three level drawer was next to a bookshelf, and a huge window that looked outside were all present, if not a little dusty. 
Rokkaku himself was a tall man, even though he was sitting down. His skin was tanned, and he was smoking a pipe that didn’t give off a tobacco smell. His eyes were a piercing crimson, and it was almost intimidating. However, he smiled, making him seem like a kind person. “I wasn’t expecting you all to come at the same time, but this is fine too,” he spoke. “Now, then, introductions. I’m Rokkaku, the captain of the Court of Enma, Underworld Escort branch. You all are…?”
The six gave their introductions by name, not dropping their formalities. Rokkaku nodded, committing the names to memory. “Alright, well, I have a very important mission for you all today.” Right off the bat? the six thought, feeling nervous. What would they be asked to do so early on? Defeat a rampaging demon? capture a deceased one? Maybe even fight the captain?
But instead, it was none of those things. “The archives are quite a mess, you see. I’ve always wanted some helping hands. You all can start by organizing the place and the documents, preferably in a fashion that makes the books easy to find.”
And that’s how the six found themselves in the library. A thin layer of dust covered some parts of the shelves, and the books had clearly, at some point, all been removed and stacked upon the many desks. There wasn’t just one floor, either. Aside from the library, though, there was another room that led to more documents, also a huge mess. No wonder Rokkaku had asked the six to clean the place up. It was a huge task, for one person.
“I didn’t really think we’d be doing this,” Tagami complained, letting out a sigh. “So bothersome.” Still, if it was their first mission, it was best that they did well. So, with cleaning supplies, the six went to work, organizing the place and making it sparkle. The first thing they did was move the remaining books of the shelves to clean the dust off. Next, they moved the books off the tables to clean that.
Once all the surfaces were nice and shining, they had to go through the books and begin dusting them off and figuring out a good way to organize it. Only then could they think about getting the floors cleaned.
“Uwah, this is SO! Boring!” Hirahara complained, unable to clean one more book. The sun was already passed midpoint in the sky, and sooner or later, it would set. “I want to do something fun! Tagamiiiii!”
“Hirahara, come on,” Saeki encouraged while lifting a pile of books. “It’s only our first day.”
“What if,” Kinoshita said, rather mindlessly as he wiped one of the book covers with a wet rag, “we were requested to come here to do house work?” That made the other five nervous. There was no way, right? The Underworld Escorts preserved the balance in hell and served to capture and punish deceased ones. There was no way they were reduced to house keepers.
“Don’t kid!” Tanizaki finally spoke up, from the second floor. His voice echoed in the closed hall. “There’s no way that’s the reason we’re here!” That silenced everyone for a while. As they worked quietly, Kirishima paid more attention to some of the titles of the books. World of Stars, Herbal Medicines, all sorts of interesting things were in the library. It might actually be fun to sit down and read them, some other time.
It wasn’t long, however, before Tagami spotted someone peeking in through the door of the library. She had long hair and a blue kimono on, and had a basket of laundry on the floor next to her. “Hello…” She greeted, seeing that she was spotted. “Are you… the new escorts…?”
“Yeah!” Hirahara smiled, getting up and running over to her. “We’re cleaning up the library for our first mission!” That surprised the girl, and she jumped back a little.
“Watch it!” a different voice suddenly yelled out. “Don’t scare me like that!” The sudden voice was quite a shock for everyone, but soon they realized that it had come from the girl. To be specific, the back of her head, where Hirahara could see a second mouth.
“U-u-uh…!” The girl hurried to cover the mouth with her hand, bowing in apology. “I’m… Ayako. I do the laundry and cleaning…!” She observed the six before picking up a book near her. “I can’t… help right now because I’m washing your sheets but… maybe later, I can help.”
“It’s alright,” Saeki smiled, coming over as well. “We’ll get this place organized by the day’s end.”
“You know,” Ayako said, handing the book to Saeki. “Rokkaku-san has studied every book in this library. That’s why it’s such a mess.” She giggled a little to herself. “Sometimes he forgets to put books back after he’s done, so they’re scattered around.”
“You mean…” Kirishima looked around at all the books that were on the ground. “He’s read every single one of these?” Ayako nodded, inching back towards her laundry basket.
“Y-yes, he’s very well versed in this world, and the Living World.” She then excused herself, saying that she was pretty busy as well, preparing six new rooms.
“That’s… really impressive,” Tanizaki finally said, feeling like he had a newfound respect for Rokkaku. The six continued with their mission, at last finding a place for each book on the shelf, and a folder for each document in the archives. Before they even realized it, the sun had set already. Tired, but feeling accomplished, the escorts looked at their handiwork. The library was definitely better now, more organized and clean.
They were just about to relax when they heard someone walking towards them, followed by the deep voice. “Oh, you’re all done,” Rokkaku said, standing in the doorway. He smiled, seeing how the library was much different than before. “Good work on your first mission.” The escorts quickly got up to face Rokkaku, having not expected to see him. “Well done,” he smiled, giving each a pat on the head. Somehow, the action seemed… fatherly.
“Kirika’s been working all day on a feast for you all,” Rokkaku added, turning around. “To celebrate your first day, and your entry into our family.” The meal was even better than the six of them had thought. Kirika was an amazing cook, having many side dishes prepared, along with a festive main course. She also insisted on making many desserts, and it wasn’t until they started eating that the escorts realized how hungry they had become. Cleaning, to their surprise, really took a lot out of them.
The atmosphere that was created was very welcoming. Ayako joined them later as well, declaring that all their rooms were ready. Rokkaku had suggested everyone get a long rest, and in the morning, perhaps they would try a practice match against him. After all, being just one person in the manor could get rather lonely. It was needless to say, the six escorts found the Gokuto Manor to be the perfect place, filled with kind people. Today was, in summary, a perfect start to their new lives.
14 notes · View notes
ilsa-makes-things · 8 years ago
Text
How to Run a $20 Garb Challenge
WHAT IS THE CHALLENGE?
The $20 Garb Challenge is a costuming contest that I’ve run for the Dagorhir community for the past five years. The idea is to make the best possible garb outfit you can, using only $20 of materials and in only 30 days. It’s organized by a host/administrator, scored by a panel of three judges on three categories, and the winners get faaaabulous prizes. Entrants have to acquire all materials within those thirty days (they can’t draw on your existing stash of materials), and a third of their score comes from how well they explain their process.
I (Ilsa of Drentha!) started the challenge because I was tired of hearing “good garb is too expensive!” I also wanted to see more garb tutorials that would help new players. The Challenge is meant to prove that you CAN make a fantastic Dagorhir/LARP/foam-fighting costume on a budget. You really don’t have to be rich to play these games!
If you want to run your own version of the Challenge for your local group, here’s how to do it! You can change any element of the contest to suit your needs, but these tactics have served us well for the past few years. :) So!
1. Decide where you’ll host it.
The Challenge is an online contest. I've run this on a group forum before, but I've since found that Facebook is a great platform for it, instead. Each entrant submits an album of photos to the group’s albums, so the judges and observers can find all the entries in the same place.
HERE is our group from 2017. Click around a bit, and you’ll see the entries in the albums, the FAQ and rules in the “files” section, and posts with questions and remarks from participants. These are easiest viewed on desktop Facebook-- mobile FB makes it hard to find some of these elements!
2. Decide WHEN you’ll run it.
The Challenge is a month long. That’s because your contestants need time to put together their entries. I run ours in May. This is nice because it’s right before Ragnarok, Dagorhir’s huge June event. This gives everyone an incentive to join the contest— you always needs extra garb for Rag!— and takes advantage of pre-event excitement. If you have a local event that people are already preparing for, I highly suggest running the Challenge before it!
Alternatively, if you have a slack time of year, like winter, you might want to run the Challenge then. This keeps your locals excited and engaged with the game, even when the weather is too nasty to play outside.
2. Figure out your prizes!
The contest is most fun if you can compete for prizes, so you’ll want to offer up goodies for your winners. A month or so before I launch that year's contest, I privately ask in-game merchants that I'm friendly with if they would consider donating a prize. In exchange, we always make sure to link to their shop page when we announce the prizes— it’s good advertising for them! If you’re a small group or just starting out, you might make the prizes yourself, purchase them from merchants, or ask other members of your realm for donations.
We typically aim to offer prizes for the top three contestants, but it’s fun if you can offer more, too. We’ve had merchants put up 4th and 5th place prizes, too!
The best prizes are things that will be useful to anyone who wins it. Items that can be customized for the winner later, store credit to shops, or pieces that can go with any kit always go over well. We've had sponsors contribute foam weapons, costumes, jewelry, pottery, etched glass vessels, tankards, and more!
Since the winning entries are picked by a panel of judges, I like to also offer an extra “people’s choice” award. This award is the crowd favorite, and anyone can win. This is announced on the 1st of June (a day after the end of the contest). The Facebook album that gets the most “likes” before the end of the week gets this prize. (THESE are the rules we use for People’s Choice.) This helps fill time between the contest ending and the judges filling out their scoring sheets. You can also offer a raffle prize— everyone who enters gets a chance to win it, because it’s randomly drawn! This encourages everyone to finish and submit their entries: even if they’re not perfect, they still have a chance to win something nice. :)
If you have an in-person event coming up that your sponsoring merchants are attending, your winners might be able to collect or pick out their prizes in person. If that’s not an option, ask if the merchants will be willing to ship the prizes to the winners. If not, set aside a budget for yourself so you can pay to ship the prizes to your winners.
4. Pick your judges.
Your judges should be respected and mature members of the community. If you’re running your contest for a group that covers a large geographical area (ours involves all of Dagorhir, from Alaska to Maryland!), try to pull your judges from a variety of places, units and backgrounds— not just from your local realm and friends. Merchants (who aren’t already sponsoring), skilled craftspeople, veterans who are heavily involved in improving the community, past winners, and people who help run A&S competitions are all great judges.
You COULD pick winners for the Challenge by popular vote, but I always worry that the winner the winner will always be the vet with the most friends, not necessarily the best entry. If you want to do popular vote, again, consider running that as a separate thing— you could offer an extra prize for “People’s Choice!”
5. Set up your group.
You’ll set up a Facebook group for your contest. You’ll want to set up the group at least two weeks in advance of the start of the contest, so you can advertise it, get people to join, and build excitement.
For the first week or so, you might want to keep moderator approval turned on for posts to the group— it lets you answer questions before the post goes live to the group, so you can catch issues and weigh in on them before everyone else weighs in.
Use the “pinned post” option to tack important announcements to the top of the page.
You’ll upload a couple documents to the “files” section. These are your vital documents, like “How to Enter + Judging,” and Rules/FAQ. (See links for our current versions of each.) You might also include a list of the prizes you’re offering here, but I think it’s more fun to announce these over the course of a week or two, to keep people excited about the contest.
If your group gets big, you might consider adding another moderator to help you keep track of the posts. This should be someone, ideally, who isn’t a judge or a sponsor— just another respected, responsible member of the community who can help herd the cats and answer questions.
6. Spread the word!
Share your Challenge group with other areas of your community! If you have a website, group forum, or social media page for your game, be sure to post about the Challenge there. Tell your new players in person, and encourage your friends to spread the word. The more, the merrier!
7. Run the contest!
The contest runs for 30 days, and the contestants can upload their entry album as soon as they’re ready. These 30 days are a great time to share resources, tutorials, hype your prizes, encourage your entrants, and build community. Your contestants will probably have a fun time talking about their successes, the materials they’ve found, and the plans they’ve made. Give them a chance to do just that by prompting them with discussion questions!
Don’t be surprised if you get lots of people who join the group just to observe— lots of people are interested in budget garb, even if they don’t have the time to join the Challenge! Be sure to remind everyone that the Challenge is also a resource for new players, and encourage them to share it with their friends and local players.
8. Judge the entries...
Towards the end of the month, remind your contestants when entries will close. We use “midnight on May 31st, wherever you are,” so no one has to worry about time zones. As soon as the contest is officially closed to new entries, your judges will start recording their scores.
Your judges will be scoring each entry on three categories— creativity, use of budget, and write-up. Each subcategory is worth 10 points from each judge, so you’ll be awarding each entry out of 30 points. Since there are three judges, a perfect score would be 90 total points.
Judging usually takes at least a week, because your judges are probably very, very busy people!
It’s up to you whether you want to share everyone’s final scores or just announce the top winners. These days, we announce the top five winners and privately send everyone else their scores. They then have the option to share these, or not, with the group.
9. ...by using the spreadsheet...
The spreadsheet is HERE. Please copy the spreadsheet to make a master sheet for your contest. (Go to File --> Make a Copy.)
The scoring sheet has four sheets that your judges will use— one for scoring each subcategory, and one master sheet for you to enter any comments you have. You can toggle between these in the sheet at the bottom left. The comments aren’t necessary, but entrants really appreciate them. Try to keep them positive!
Your judges each have a color-coded column on each sub-sheet that highlights where you’ll be putting your scores. Judge #1 is always green, Judge #2 is always mauve, and Judge #3 is always yellow. If the column is white, it’s either something that will calculate automatically or be filled out by the non-judge admin/host.
The “ranking” column in “Total scores (updates automatically) and comments” is the most important one, and it should update automatically. It will show you which entrant has the top score, and if there are any ties. “1” means they’re in first place, etc.
If anything looks broken, it might just be that the sheet wants values it hasn’t been given yet. Certain things will update automatically as you enter your scores. Remember that it ain’t over until it’s over— if just one judge, say, has entered their scores, someone might look like they’re winning, but that might change before the scoring is over!
Each entrant’s name should be updated by the admin/host to link to the Facebook album of their entry in the Facebook group. This makes it easier for the judges to figure out who they’re scoring at any given moment.
Alternatively, you might want to give each judge a copy of their own sheet, so they can't be influenced by seeing the scores of other judges. We may try this, next year, so there's no peer pressure to reach a consensus. :)
10. ...and this bare-bones scoring rubric.
Each judge scores each entry out of ten points in three categories: Creativity, Use of Budget, and Write-Up. There are three judges who can each award a maximum of thirty points. Their scores are added together, so the highest possible score for any entry is 90 points. Each judge will score slightly differently (in fact, we try to pick judges who have different backgrounds and tastes!), so I created this rubric, based on other A&S contests, to help them in their judging. Note that this rubric mentions Dagorhir a lot-- if you’re running the Challenge for a different community, edit that out!
Creativity:
1 point: No thought put into choice of materials and design-- very basic default garb put together in a standard way, ie, a two-seam tunic with scrub pants, or made of the first things grabbed at the thrift store. Also includes garb that fails by the Manual of Arms for obtrusive modern components, illegal colors, etc.
3 points: Passes by the MoA, but is boring and made in standard ways. Brief thought went into the design process, but it produced generic garb-- ie, you used your personal colors but produced a “generiViking” kit.
5 points: Concept OR use of materials are original, but not both. Wouldn’t give it a second look on the field, either for good or bad reasons. Decent “background Dagorhir character” garb. Standard garb made with standard materials. 
7 points: A new spin on construction and concept. Delved deeper than the standard resources. May have set an interesting personal challenge (garbing multiple people, a whole week of garb, etc) or tried to tackle a kit not normally seen in Dagorhir.
10 points: Wildly original in both concept and use of materials. Is aesthetically impressive. Something we haven’t seen in Dagorhir before. 
Use of Budget:
1 point: Materials wasted, went far over budget, OR entrant did something that feels cheap and unfair to other contestants-- shopping from their pre-established materials stash; large gifts of materials from friends, etc.
3 points: Materials wasted, paid too much for materials. Slightly over budget or had $10 or more left over.
5 points: Entrant paid standard prices for standard materials. Anyone could get these materials on any day of the week. Had $5 or more left over. 
7 points: Some cunning put into acquiring materials, but methods were standard (ie, JoAnn’s coupons, waiting for sales, etc). Very little left over. 
10 points: Entrant got an objectively impressive amount of material out of their $20. May have gone to new lengths to stretch their resources (making components from scratch, dumpster-diving, extensive thrifting, repurposing, upcycling, etc). Patience and cunning were used in putting together this kit. Used every bit of their money.
Write-Up:
1 point: Write-up is incoherent or nonexistent. 
3 points: Write-up doesn’t credit resources used or describe the creation process. A new craftsperson following this would be utterly lost.
5 points: Write-up mostly links to tutorials written by other people. Explains design process or construction, but not both. A new craftsman following this would struggle to replicate your results.
7 points: A solid walk-through, well documented (ie, lots of process pictures). A new craftsman could get through it. May explain processes already extensively documented elsewhere in the garb-o-sphere (ie, describes how to sew a basic seam), but explains them well. 
10 points: Write-up provides extensive documentation of design process, construction methods, and resources used. A high-quality tutorial with original content that doesn’t already exist on the internet. A new craftsman could follow this with no confusion and use the skills learned to make different things later.
11. Announce your winners!
People will REALLY want to know in advance WHEN you’ll announce your winners, so be sure you let them know when they can expect to see the prizes go up!  The host will announce the winners on the FB page and get them in touch with the merchants who are sponsoring prizes. I like to start with fourth place (or whatever the last place I have prizes for is) and work up to announcing first. It’s fun if you can get winners’ certificates made for your winners! This also helps the sponsoring merchants know who the winners are: the winner just displays their certificate when they go to the merchant to pick up their prize.
Be sure to thank your entrants, judges, and sponsors! This is a TON of work for everyone involved, but it’s huge fun and it’s great for the community.
12. Wrap things up.
You’ll wrap up the contest by announcing the winners, putting the winners in touch with the sponsoring merchants so they can arrange to receive their prizes, and thanking everyone for their participation. It can be fun to start a discussion about what everyone liked best this year, and what they want to do differently next time. Encourage your participants to keep it positive— even if they didn’t win, they made a great outfit for the cost of a large pizza, and that’s always a plus!
If you have an in-person event coming up, encourage your participants to meet, enter any Arts and Sciences contests that are running at that event, and thank the judges and sponsoring merchants in person. It’s also a nice touch for the host to personally thank the judges— they volunteer a lot of their time, and without them, the Challenge would be impossible!
13. Tell me how it went! :D
I’m always curious to see peoples’ entries close-up, so if you’ve entered the Dagorhir $20 Garb Challenge, you’re always welcome to come by to Drentha camp and say hi! If you’ve run your own version of the contest, please let me know— this is a cause I really believe in, so I really want to hear how it went, wherever you run it!
Thanks, and happy garb-ing!
26 notes · View notes
deborahringgold · 5 years ago
Text
Electriq Power Q&A
Reading Time: 6 minutes
Installations of energy storage systems are skyrocketing throughout the country over the last couple of years. In fact, residential installs increased 500 percent from 2017 to 2018! A number of different companies are introducing batteries to help meet this increased demand, creating a crowded field of products to choose from.
In order to help you sift through the numerous options, EnergySage is interviewing storage manufacturers to learn more about their product offerings and company. Recently, we sat down with Electriq Power to discuss the history of the company, what differentiates their primary product for homeowners (the PowerPod), and where they see the energy storage industry evolving in the coming years. 
The history and growth of Electriq Power
EnergySage: Tell us about the history of Electriq Power. When were you founded? How has Electriq Power grown over time? 
Electriq Power, Inc., set up its first lab in a garage in San Leandro, CA, in late 2014. After purchasing a totaled Nissan Leaf and stripping the battery and computers for parts, the Electriq team went to work attempting to build our first home battery prototype. After four months of building, testing, rebuilding, and retesting, Electriq’s first energy storage prototype was complete.
Over the next few years, the team grew, investors emerged, and Electriq’s original prototype evolved into our first consumer-ready smart home battery, the IQ System. And even though the energy storage market was still in its infancy, consumers recognized the need for home energy storage.
Fast forward to present day, we now occupy over 5,000 sq. ft. at our headquarters, which is still in San Leandro, and our home battery systems can be found in customers’ homes and small businesses all over the world. Among these are systems that Electriq Power has donated to hurricane-stricken areas like Puerto Rico and Haiti to help them become more resilient during dangerous weather conditions.
The PowerPod: Electriq Power’s flagship battery
EnergySage: The PowerPod is your primary product for homeowners and small business owners. What separates the PowerPod from the rest of the pack? 
The Electriq PowerPod differentiates from other systems in a number of ways. Primarily, the flexibility of the system allows installers and homeowners a number of possible configurations to fit their needs. We can stack both the kW and kWh of the systems. The base system is 5.5 kW but can stack up to 16.5 kW of continuous output and 11.4 – 102 kWh. The system can be installed grid-tied or in off-grid scenarios. It can also be configured with a generator to provide a third layer of backup power. 
We’re also proud that we’re able to offer one of the most affordable systems on the market today. Our DC-coupled system does not require any additional solar inverter, transformer, charge controller, transfer switch, etc. This not only keeps equipment cost down, but reduces installation time and balance of system costs. 
Finally, and most importantly, we are a software company at our core, and focus on the development of smart battery features and benefits. Each system comes with the Electriq Dashboard, an online dashboard that provides analytics and insight on production, consumption, and storage data in an intuitively designed interface. Correlating utility rates, weather predictions, historical consumption, and other factors, Electriq Dashboard automates savings by controlling the PowerPod to lower energy consumption during peak rates. On top of monitoring and maximizing savings, through the Dashboard, homeowners are able to switch modes remotely. For example, a customer in California would typically be in a TOU mode discharging their battery everyday. The utility may then send a notice that due to high winds they will be shutting down power at 8:00 am the next morning. Instead of waiting until they get home to change modes, a PowerPod customer can go to their app and with one click, move into Backup mode, which will immediately prioritize the charging of their battery, and maintain a full charge until the grid event has passed. Electriq Dashboard is available on both web and mobile applications, and can be accessed from anywhere in the world through the cloud.
Consumer interest in storage
EnergySage: What is the primary motivation for your customers to install energy storage systems and what are the primary factors they consider in their purchase? 
First and foremost, a backup home power system is just that: a backup for emergencies. If the power goes out, your home backup system will kick in, providing you with power until the main system is restored.
Newer backup home systems also come with smart technology that helps homeowners in many different ways. Smart technology, like the software that comes with the PowerPod, can help homeowners save money on their energy bill, and it gives them insight into how their energy is being consumed. Some systems can connect to a solar energy system, as well as to the electrical grid. The energy that is harvested from your solar panels, and/or energy pulled from the grid, can be stored within the home battery system for use at a later time. In the event of a power outage, the system will automatically switch off from the grid and begin pulling power from the backup system. Which system is most suitable for you comes down to your individual wants, needs, and circumstances. Your first consideration should be your overall power usage.
It is important for customers to be mindful of the capacities of their energy storage systems, which are designed to keep essential loads backed up for an extended period of time. If homeowners want to back up larger appliances, like 5 ton AC units, they’re going to significantly lower the time that the essential load will stay on. Customers should prioritize their power needs to optimize the battery’s duration. The major functions you’d want to keep running would be lighting, outlets, fridge, TV, internet, etc. Plus, the system cost difference between backing up essential loads and all loads can be significant. 
EnergySage: What factors are consumers *not* considering about energy storage that they should be?
Many customers today aren’t thinking about the long-term impact of their energy storage system choice. Solar PV systems should last 20 – 30 years, while battery systems are usually warrantied for 10 years, so it is likely you’ll have to replace the battery during the life of the solar panel system. Other systems on the market require you to replace the entire enclosure and system. This is like a car manufacturer making you replace the whole car anytime the battery dies. The PowerPod is modularly built so that you can simply replace the battery pack and not the entire enclosure. When it comes to cost efficiency and longevity, homeowners should be thinking about lifecycle system expenses when deciding on a home storage system. 
EnergySage: What do you see driving storage adoption rates in the future?
The beauty of energy storage is that it can provide multiple value streams depending on your location. With the increase in natural disasters, more utilities imposing Time of Use rates, and other factors, we see energy storage deployments growing throughout the country. Outside of California, the markets with the most momentum areHawaii, Puerto Rico, the Caribbean, Florida, Texas, and the Northeast. As prices continue to decrease, we’re also seeing parts of the Midwest show increasing interest in moving away from generators and opting for clean and quiet PowerPods.
The future of energy storage
EnergySage: Where do you see the energy storage industry moving over the next 6-18 months, and what is the main barrier to achieving that vision? 
We live in a 24-hour, 7-day-a-week society. Consumers’ lives have become totally dependent on uninterrupted power – from that first cup of homebrewed coffee in the morning, to those late-night emails sent from home in the evening. This constant, consistent access to energy allows us to withdraw money from an ATM, pump gas into our cars, pedal through those after work spin classes and everything in between, all without a moment of thought as to how this consumer lifestyle is made possible.
Over the next 6-18 months, we will see a much greater rate of adoption for energy storage. Right now, the main roadblock is figuring out how to let consumers know that there are alternatives to how they consume energy. As prices of hardware continue to fall and incentives continue to offset costs, the total installed cost of a solar + storage system will be much more attractive to homeowners.
EnergySage: What will solar + storage homes look like a year from now?
A year from now, a home with solar + storage  will be one that can harvest and consume most of its own energy and  ride through blackouts. We like to call it a home with true peace of mind. The increased frequency of extreme weather and climate events is now the leading cause of major power outages. Millions of customers are at risk of experiencing recurring blackouts that endanger businesses, homes, and lives. We want to protect more customers by offering an intelligent energy storage solution for their homes.
Find out what solar costs in your area in 2020
from Solar Energy https://news.energysage.com/electriq-power-qa/
0 notes
suzanneshannon · 5 years ago
Text
Roll Your Own Comments With Gatsby and FaunaDB
If you haven’t used Gatsby before have a read about why it’s fast in every way that matters, and if you haven’t used FaunaDB before you’re in for a treat. If you’re looking to make your static sites full blown Jamstack applications this is the back end solution for you!
This tutorial will only focus on the operations you need to use FaunaDB to power a comment system for a Gatsby blog. The app comes complete with inputs fields that allow users to comment on your posts and an admin area for you to approve or delete comments before they appear on each post. Authentication is provided by Netlify’s Identity widget and it’s all sewn together using Netlify serverless functions and an Apollo/GraphQL API that pushes data up to a FaunaDB database collection.
Tumblr media
I chose FaunaDB for the database for a number of reasons. Firstly there’s a very generous free tier! perfect for those small projects that need a back end, there’s native support for GraphQL queries and it has some really powerful indexing features!
…and to quote the creators;
No matter which stack you use, or where you’re deploying your app, FaunaDB gives you effortless, low-latency and reliable access to your data via APIs familiar to you
You can see the finished comments app here.
Get Started
To get started clone the repo at https://github.com/PaulieScanlon/fauna-gatsby-comments
or:
git clone https://github.com/PaulieScanlon/fauna-gatsby-comments.git
Then install all the dependencies:
npm install
Also cd in to functions/apollo-graphql and install the dependencies for the Netlify function:
npm install
This is a separate package and has its own dependencies, you’ll be using this later.
We also need to install the Netlify CLI as you’ll also use this later:
npm install netlify-cli -g
Now lets add three new files that aren’t part of the repo.
At the root of your project create a .env .env.development and .env.production
Add the following to .env:
GATSBY_FAUNA_DB = GATSBY_FAUNA_COLLECTION =
Add the following to .env.development:
GATSBY_FAUNA_DB = GATSBY_FAUNA_COLLECTION = GATSBY_SHOW_SIGN_UP = true GATSBY_ADMIN_ID =
Add the following to .env.production:
GATSBY_FAUNA_DB = GATSBY_FAUNA_COLLECTION = GATSBY_SHOW_SIGN_UP = false GATSBY_ADMIN_ID =
You’ll come back to these later but in case you’re wondering
GATSBY_FAUNA_DB is the FaunaDB secret key for your database
GATSBY_FAUNA_COLLECTION is the FaunaDB collection name
GATSBY_SHOW_SIGN_UP is used to hide the Sign up button when the site is in production
GATSBY_ADMIN_ID is a user id that Netlify Identity will generate for you
If you’re the curious type you can get a taster of the app by running gatsby develop or yarn develop and then navigate to http://localhost:8000 in your browser.
FaunaDB
So Let’s get cracking, but before we write any operations head over to https://fauna.com/ and sign up!
Database and Collection
Create a new database by clicking NEW DATABASE
Name the database: I’ve called the demo database fauna-gatsby-comments
Create a new Collection by clicking NEW COLLECTION
Name the collection: I’ve called the demo collection demo-blog-comments
Tumblr media
Server Key
Now you’ll need to to set up a server key. Go to SECURITY
Create a new key by clicking NEW KEY
Select the database you want the key to apply to, fauna-gatsby-comments for example
Set the Role as Admin
Name the server key: I’ve called the demo key demo-blog-server-key
Tumblr media
Environment Variables Pt. 1
Copy the server key and add it to GATSBY_FAUNA_DB in .env.development, .env.production and .env.
You’ll also need to add the name of the collection to GATSBY_FAUNA_COLLECTION in .env.development, .env.production and .env.
Adding these values to .env are just so you can test your development FaunaDB operations, which you’ll do next.
Let’s start by creating a comment so head back to boop.js:
// boop.js ... // CREATE COMMENT createComment: async () => { const slug = "/posts/some-post" const name = "some name" const comment = "some comment" const results = await client.query( q.Create(q.Collection(COLLECTION_NAME), { data: { isApproved: false, slug: slug, date: new Date().toString(), name: name, comment: comment, }, }) ) console.log(JSON.stringify(results, null, 2)) return { commentId: results.ref.id, } }, ...
The breakdown of this function is as follows;
q is the instance of faunadb.query
Create is the FaunaDB method to create an entry within a collection
Collection is area in the database to store the data. It takes the name of the collection as the first argument and a data object as the second.
The second argument is the shape of the data you need to drive the applications comment system.
For now you’re going to hard-code slug, name and comment but in the final app these values are captured by the input form on the posts page and passed in via args
The breakdown for the shape is as follows;
isApproved is the status of the comment and by default it’s false until we approve it in the Admin page
slug is the path to the post where the comment was written
date is the time stamp the comment was written
name is the name the user entered in the comments from
comment is the comment the user entered in the comments form
When you (or a user) creates a comment you’re not really interested in dealing with the response because as far as the user is concerned all they’ll see is either a success or error message.
After a user has posted a comment it will go in to your Admin queue until you approve it but if you did want to return something you could surface this in the UI by returning something from the createComment function.
Create a comment
If you’ve hard coded a slug, name and comment you can now run the following in your CLI
node boop createComment
If everything worked correctly you should see a log in your terminal of the new comment.
{ "ref": { "@ref": { "id": "263413122555970050", "collection": { "@ref": { "id": "demo-blog-comments", "collection": { "@ref": { "id": "collections" } } } } } }, "ts": 1587469179600000, "data": { "isApproved": false, "slug": "/posts/some-post", "date": "Tue Apr 21 2020 12:39:39 GMT+0100 (British Summer Time)", "name": "some name", "comment": "some comment" } } { commentId: '263413122555970050' }
If you head over to COLLECTIONS in FaunaDB you should see your new entry in the collection.
Tumblr media
You’ll need to create a few more comments while in development so change the hard-coded values for name and comment and run the following again.
node boop createComment
Do this a few times so you end up with at least three new comments stored in the database, you’ll use these in a moment.
Delete comment by id
Now that you can create comments you’ll also need to be able to delete a comment.
By adding the commentId of one of the comments you created above you can delete it from the database. The commentId is the id in the ref.@ref object
Again you’re not really concerned with the return value here but if you wanted to surface this in the UI you could do so by returning something from the deleteCommentById function.
// boop.js ... // DELETE COMMENT deleteCommentById: async () => { const commentId = "263413122555970050"; const results = await client.query( q.Delete(q.Ref(q.Collection(COLLECTION_NAME), commentId)) ); console.log(JSON.stringify(results, null, 2)); return { commentId: results.ref.id, }; }, ...
The breakdown of this function is as follows
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Delete is the FaunaDB delete method to delete entries from a collection
Ref is the unique FaunaDB ref used to identify the entry
Collection is area in the database where the data is stored
If you’ve hard coded a commentId you can now run the following in your CLI:
node boop deleteCommentById
If you head back over to COLLECTIONS in FaunaDB you should see that entry no longer exists in collection
Indexes
Next you’re going to create an INDEX in FaunaDB.
An INDEX allows you to query the database with a specific term and define a specific data shape to return.
When working with GraphQL and / or TypeScript this is really powerful because you can use FaunaDB indexes to return only the data you need and in a predictable shape. This makes data typing responses in GraphQL and / TypeScript a dream… I’ve worked on a number of applications that just return a massive object of useless values which will inevitably cause bugs in your app. blurg!
Tumblr media
Go to INDEXES and click NEW INDEX
Name the index: I’ve called this one get-all-comments
Set the source collection to the name of the collection you setup earlier
As mentioned above when you query the database using this index you can tell FaunaDB which parts of the entry you want to return.
You can do this by adding “values” but be careful to enter the values exactly as they appear below because (on the FaunaDB free tier) you can’t amend these after you’ve created them so if there’s a mistake you’ll have to delete the index and start again… bummer!
The values you need to add are as follows:
ref
data.isApproved
data.slug
data.date
data.name
data.comment
After you’ve added all the values you can click SAVE.
Get all comments
// boop.js ... // GET ALL COMMENTS getAllComments: async () => { const results = await client.query( q.Paginate(q.Match(q.Index("get-all-comments"))) ); console.log(JSON.stringify(results, null, 2)); return results.data.map(([ref, isApproved, slug, date, name, comment]) => ({ commentId: ref.id, isApproved, slug, date, name, comment, })); }, ...
The breakdown of this function is as follows
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Paginate paginates the responses
Match returns matched results
Index is the name of the Index you just created
The shape of the returned result here is an array of the same shape you defined in the Index “values”
If you run the following you should see the list of all the comments you created earlier:
node boop getAllComments
Get comments by slug
You’re going to take a similar approach as above but this time create a new Index that allows you to query FaunaDB in a different way. The key difference here is that when you get-comments-by-slug you’ll need to tell FaunaDB about this specific term and you can do this by adding data.slug to the Terms field.
Tumblr media
Go to INDEX and click NEW INDEX
Name the index, I’ve called this one get-comments-by-slug
Set the source collection to the name of the collection you setup earlier
Add data.slug in the terms field
The values you need to add are as follows:
ref
data.isApproved
data.slug
data.date
data.name
data.comment
After you’ve added all the values you can click SAVE.
// boop.js ... // GET COMMENT BY SLUG getCommentsBySlug: async () => { const slug = "/posts/some-post"; const results = await client.query( q.Paginate(q.Match(q.Index("get-comments-by-slug"), slug)) ); console.log(JSON.stringify(results, null, 2)); return results.data.map(([ref, isApproved, slug, date, name, comment]) => ({ commentId: ref.id, isApproved, slug, date, name, comment, })); }, ...
The breakdown of this function is as follows:
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Paginate paginates the responses
Match returns matched results
Index is the name of the Index you just created
The shape of the returned result here is an array of the same shape you defined in the Index “values” you can create this shape in the same way you did above and be sure to add a value for terms. Again be careful to enter these with care.
If you run the following you should see the list of all the comments you created earlier but for a specific slug:
node boop getCommentsBySlug
Approve comment by id
When you create a comment you manually set the isApproved value to false. This prevents the comment from being shown in the app until you approve it.
You’ll now need to create a function to do this but you’ll need to hard-code a commentId. Use a commentId from one of the comments you created earlier:
// boop.js ... // APPROVE COMMENT BY ID approveCommentById: async () => { const commentId = '263413122555970050' const results = await client.query( q.Update(q.Ref(q.Collection(COLLECTION_NAME), commentId), { data: { isApproved: true, }, }) ); console.log(JSON.stringify(results, null, 2)); return { isApproved: results.isApproved, }; }, ...
The breakdown of this function is as follows:
client is the FaunaDB client instance
query is a method to get data from FaunaDB
q is the instance of faunadb.query
Update is the FaundaDB method up update an entry
Ref is the unique FaunaDB ref used to identify the entry
Collection is area in the database where the data is stored
If you’ve hard coded a commentId you can now run the following in your CLI:
node boop approveCommentById
If you run the getCommentsBySlug again you should now see the isApproved status of the entry you hard-coded the commentId for will have changed to true.
node boop getCommentsBySlug
These are all the operations required to manage the data from the app.
In the repo if you have a look at apollo-graphql.js which can be found in functions/apollo-graphql you’ll see the all of the above operations. As mentioned before the hard-coded values are replaced by args, these are the values passed in from various parts of the app.
Netlify
Assuming you’ve completed the Netlify sign up process or already have an account with Netlify you can now push the demo app to your GitHub account.
To do this you’ll need to have initialize git locally, added a remote and have pushed the demo repo upstream before proceeding.
You should now be able to link the repo up to Netlify’s Continuous Deployment.
If you click the “New site from Git” button on the Netlify dashboard you can authorize access to your GitHub account and select the gatsby-fauna-comments repo to enable Netlify’s Continuous Deployment. You’ll need to have deployed at least once so that we have a pubic URL of your app.
The URL will look something like this https://ecstatic-lewin-b1bd17.netlify.app but feel free to rename it and make a note of the URL as you’ll need it for the Netlify Identity step mentioned shortly.
Tumblr media
Environment Variables Pt. 2
In a previous step you added the FaunaDB database secret key and collection name to your .env files(s). You’ll also need to add the same to Netlify’s Environment variables.
Navigate to Settings from the Netlify navigation
Click on Build and deploy
Either select Environment or scroll down until you see Environment variables
Click on Edit variables
Proceed to add the following:
GATSBY_SHOW_SIGN_UP = false GATSBY_FAUNA_DB = you FaunaDB secret key GATSBY_FAUNA_COLLECTION = you FaunaDB collection name
While you’re here you’ll also need to amend the Sensitive variable policy, select Deploy without restrictions
Netlify Identity Widget
I mentioned before that when a comment is created the isApproved value is set to false, this prevents comments from appearing on blog posts until you (the admin) have approved them. In order to become admin you’ll need to create an identity.
You can achieve this by using the Netlify Identity Widget.
If you’ve completed the Continuous Deployment step above you can navigate to the Identity page from the Netlify navigation.
Tumblr media
You wont see any users in here just yet so lets use the app to connect the dots, but before you do that make sure you click Enable Identity
Before you continue I just want to point out you’ll be using netlify dev instead of gatsby develop or yarn develop from now on. This is because you’ll be using some “special” Netlify methods in the app and staring the server using netlify dev is required to spin up various processes you’ll be using.
Spin up the app using netlify dev
Navigate to http://localhost:8888/admin/
Click the Sign Up button in the header
You will also need to point the Netlify Identity widget at your newly deployed app URL. This was the URL I mentioned you’ll need to make a note of earlier, if you’ve not renamed your app it’ll look something like this https://ecstatic-lewin-b1bd17.netlify.app/ There will be a prompt in the pop up window to Set site’s URL.
You can now complete the necessary sign up steps.
After sign up you’ll get an email asking you to confirm you identity and once that’s completed refresh the Identity page in Netlify and you should see yourself as a user.
It’s now login time, but before you do this find Identity.js in src/components and temporarily un-comment the console.log() on line 14. This will log the Netlify Identity user object to the console.
Restart your local server
Spin up the app again using netlify dev
Click the Login button in the header
If this all works you should be able to see a console log for netlifyIdentity.currentUser: find the id key and copy the value.
Set this as the value for GATSBY_ADMIN_ID = in both .env.production and .env.development
You can now safely remove the console.log() on line 14 in Identity.js or just comment it out again.
GATSBY_ADMIN_ID = your Netlify Identity user id
…and finally
Restart your local server
Spin up the app again using netlify dev
Now you should be able to login as “Admin”… hooray!
Navigate to http://localhost:8888/admin/ and Login.
It’s important to note here you’ll be using localhost:8888 for development now and NOT localhost:8000 which is more common with Gatsby development
Before you test this in the deployed environment make sure you go back to Netlify’s Environment variables and add your Netlify Identity user id to the Environment variables!
Navigate to Settings from the Netlify navigation
Click on Build and deploy
Either select Environment or scroll down until you see Environment variables
Click on Edit variables
Proceed to add the following:
GATSBY_ADMIN_ID = your Netlify Identity user id
If you have a play around with the app and enter a few comments on each of the posts then navigate back to Admin page you can choose to either approve or delete the comments.
Naturally only approved comments will be displayed on any given post and deleted ones are gone forever.
If you’ve used this tutorial for your project I’d love to hear from you at @pauliescanlon.
By Paulie Scanlon (@pauliescanlon), Front End React UI Developer / UX Engineer: After all is said and done, structure + order = fun.
Visit Paulie’s Blog at: www.paulie.dev
The post Roll Your Own Comments With Gatsby and FaunaDB appeared first on CSS-Tricks.
Roll Your Own Comments With Gatsby and FaunaDB published first on https://deskbysnafu.tumblr.com/
0 notes