20+ Years as a CTO: Lessons I Learned the Hard Way

Being a CTO isn’t what it looks like from the outside. There are no capes, no magic formulas, and certainly no shortcuts. After more than two decades leading engineering teams, shipping products, and navigating the chaos of startups and scale-ups, I’ve realized that the real challenges and the real lessons aren’t technical. They’re human, strategic, and sometimes painfully simple.

Here are the lessons that stuck with me, the ones I wish someone had told me when I started.


Clarity beats speed every time

Early in my career, I thought speed meant writing more code, faster. I would push engineers to “ship now,” measure velocity in lines of code or story points, and celebrate sprint completions.

I was wrong.

The real speed comes from clarity. Knowing exactly what problem you’re solving, who it matters to, and why it matters that’s what lets a team move fast. I’ve seen brilliant engineers grind for weeks only to realize they built the wrong thing. Fewer pivots, fewer surprises, and focus make a team truly fast.


Engineers want to care, they just need context

One of the most frustrating things I’ve witnessed is engineers shrugging at product decisions. “They just don’t care,” I thought. Until I realized: they do care. They want to make an impact. But when they don’t have context, the customer pain, the market reality, the business constraints,they can’t make informed decisions.

Once I started sharing the “why,” not just the “what,” engagement skyrocketed. A well-informed team is a motivated team.


Vision is a tactical tool, not a slogan

I’ve been guilty of writing vision statements that sounded great on slides but did nothing in practice. The turning point came when I started treating vision as a tactical tool.

Vision guides decisions in real time: Should we invest in this feature? Should we rewrite this component? When the team knows the north star, debates become productive, not paralyzing.


Great engineers are problem solvers first

I’ve worked with engineers who could write elegant code in their sleep, but struggle when the problem itself is unclear. The best engineers are not just builders, they’re problem solvers.

My role as a CTO became ensuring the problem was well-understood, then stepping back. The magic happens when talent meets clarity.


Bad culture whispers, it doesn’t shout

I’ve learned to pay attention to the quiet. The subtle signs: meetings where no one speaks up, decisions made by guesswork, unspoken assumptions. These moments reveal more about culture than any HR survey ever could.

Great culture doesn’t need fanfare. Bad culture hides in silence and it spreads faster than you think.


Done is when the user wins

Early on, “done” meant shipped. A feature went live, the ticket closed, everyone celebrated. But shipping doesn’t equal solving.

Now, “done” only counts when the user’s problem is solved. I’ve had to unteach teams from thinking in terms of output and retrain them to think in terms of impact. It’s subtle, but transformative.


Teams don’t magically become product-driven

I used to blame teams for not thinking like product people. Then I realized the missing piece was me. Leadership must act like product thinking matters. Decisions, recognition, discussions, they all reinforce the mindset. Teams reflect the leadership’s priorities.


Product debt kills momentum faster than tech debt

I’ve chased the holy grail of perfect code only to watch teams get bogged down in building the wrong features. Clean architecture doesn’t save a product if no one wants it. Understanding the problem is far more important than obsessing over elegance.


Focus is a leadership decision

I once ran a team drowning in priorities. Tools, frameworks, and fancy prioritization systems didn’t help. The missing ingredient was leadership. Saying “no” to the wrong things, protecting focus, and consistently communicating what matters that’s what accelerates teams.


Requirements are not the problem

If engineers are stuck waiting for “better requirements,” don’t introduce another process. Lead differently. Engage with your team, clarify expectations, remove ambiguity, and give feedback in real time. Requirements are never the bottleneck leadership is.


The hard-earned truth

After twenty years, I’ve realized technology is the easy part. Leadership is where the real work and the real leverage lies.

Clarity, context, vision, problem-solving, culture, focus these aren’t buzzwords. They are the forces that determine whether a team thrives or stalls.

I’ve seen brilliant teams fail, and ordinary teams excel, all because of the way leadership showed up. And that’s the lesson I carry with me every day: if you want speed, impact, and results, start with the leadership that creates the conditions for them.

Why AI won’t solve these problems

With all the excitement around AI today, it’s tempting to think that tools can fix everything. Need better requirements? There’s AI. Struggling with design decisions? AI can suggest options. Want faster development? AI can generate code.

Here’s the hard truth I’ve learned: none of these tools solve the real problems. AI can assist, accelerate, and automate but it cannot provide clarity, set vision, or foster a healthy culture. It doesn’t understand your users, your market, or your team’s dynamics. It can’t decide what’s important, or make trade-offs when priorities conflict. Those are human responsibilities, and they fall squarely on leadership.

I’ve seen teams put too much faith in AI as a silver bullet, only to discover that the fundamental challenges alignment, focus, problem definition, and decision-making still exist. AI is powerful, but it’s a force multiplier, not a replacement. Without strong leadership, even the most advanced AI cannot prevent teams from building the wrong thing beautifully, or from stagnating in a quiet, passive culture.

Ultimately, AI is a tool. Leadership is the strategy. And experience with decades of trial, error, and hard-won insight is what turns potential into real results.

Cocoa, Chocolate, and Why AI Still Can’t Discover

Imagine standing in front of a freshly picked cocoa pod. You break it open, and inside you find a pale, sticky pulp with bitter seeds. Nothing looks edible, nothing smells particularly appetizing. By every reasonable measure, this is a dead end.

Yet humanity somehow didn’t stop there. Someone, centuries ago, kept experimenting, steps that made no sense at the time:

  • Picking out the seeds and letting them ferment until they grew mold.
  • Washing and drying them for days, though still inedible.
  • Roasting them into something crunchy, still bitter and strange.
  • Grinding them into powder, which tasted worse.
  • Finally, blending that bitterness with sugar and milk, turning waste into one of the most beloved foods in human history: chocolate.

No algorithm would have told you to keep going after the first dozen failures. There was no logical stopping point, only curiosity, persistence, and maybe a bit of luck. The discovery of cocoa as food wasn’t the result of optimization, it was serendipity.

Why This Matters for AI

AI today is powerful at recombining, predicting, and optimizing. It can remix what already exists, generate new connections from vast data, and accelerate discoveries we’re already aiming toward. But there’s a limit: AI doesn’t (yet) explore dead ends with stubborn curiosity. It doesn’t waste time on paths that appear pointless. It doesn’t ferment bitter seeds and wait for mold to form, just to see if maybe, somehow, there’s something new hidden inside.

Human discovery has always been messy, nonlinear, and often illogical. The journey from cocoa pod to chocolate shows that sometimes the only way to find the extraordinary is to persist through the ridiculous.

The Future of Discovery

If we want AI to go beyond optimization and into true discovery, it will need to embrace the irrational side of exploration, the willingness to try, fail, and continue without clear reasons. Until then, AI remains a tool for extending human knowledge, not replacing the strange, stubborn spark that drives us to turn bitter seeds into sweetness.

Because the truth is: chocolate exists not because it was obvious, but because someone refused to stop at “nothing edible.”

This path makes no sense. At every step the signal says stop. No data suggests you should continue. No optimization algorithm rewards the action. Yet someone did. And that’s how one of the world’s favorite foods was discovered.

This is the gap between human discovery and AI today.

AI can optimize, remix, predict. It can explore a search space, but only one that’s already defined. It can’t decide to push through meaningless, irrational steps where there’s no reason to keep going. It won’t follow a path that looks like failure after failure. It won’t persist in directions that appear to lead nowhere.

But that’s exactly how discovery often works.

Cocoa to chocolate wasn’t about efficiency. It was curiosity, stubbornness, and luck. The same applies to penicillin, vulcanized rubber, even electricity. Breakthroughs happen because someone ignored the “rational” stopping point.

AI is far from that. Right now, it’s bounded by what already exists. It doesn’t yet invent entirely new domains the way humans stumble into them.

The lesson? Discovery is still deeply human. And the future of AI will depend not just on making it smarter, but on making it willing to walk blind paths where no reward signal exists until something unexpected emerges.

Because sometimes, you need to go through moldy seeds and bitterness to find chocolate.

When to Hire Real Engineers Instead of Freelancers for Your MVP

Building a startup is a race against time. Every day you wait to ship your idea is a day your competitors could gain an edge. That’s why many founders start with freelancers or “vibe coding” to launch their MVP (Minimum Viable Product) quickly. But this fast-track approach comes with hidden risks. There comes a point when hiring real engineers is no longer optional, it’s critical for your startup’s survival.

In this post, we’ll explore when it’s the right time to transition from freelancers to full-time engineers, and why vibe coding with low-cost freelancers can be dangerous for your MVP.


Why Start With Freelancers?

Freelancers are often the first choice for early-stage founders. Here’s why:

  • Speed: Freelancers can help you quickly prototype your idea.
  • Lower Cost: You pay for work done, without the overhead of full-time salaries or benefits.
  • Flexibility: You can scale the workforce up or down depending on the project stage.

Freelancers are perfect for validating your idea, testing market demand, or building proof-of-concept features. However, relying on freelancers too long can create technical debt and slow your growth when your product starts attracting real users.


The Hidden Dangers of Vibe Coding With Low-Cost Freelancers

Many founders are tempted by freelancers offering extremely low rates. While the idea of saving money is appealing, vibe coding with bargain-rate developers comes with serious risks:

  • Poor Code Quality: Low-cost freelancers may cut corners, leaving messy, unmaintainable code.
  • Lack of Documentation: Your codebase may be difficult for future engineers to understand or build upon.
  • Delayed Timelines: Cheap freelancers often juggle multiple clients, causing unpredictable delays.
  • False Confidence: Founders may assume their MVP is “production-ready” when it’s not.
  • Hidden Costs: Fixing technical debt later often costs more than hiring quality engineers from the start.

Using low-cost freelancers is fine for prototyping ideas quickly, but it becomes risky when your MVP starts attracting real users or paying customers.


Signs You Need Real Engineers

Here are the main indicators that your MVP has outgrown freelancers:

1. Product Complexity Increases

  • Your MVP is no longer a simple prototype.
  • Features require backend scalability, integrations, or complex logic.
  • Codebase is hard for freelancers to maintain consistently.

2. Customers Expect Stability

  • Paying users begin using your product regularly.
  • Bugs, downtime, or inconsistent updates start hurting your credibility.
  • You need reliable, professional code that can scale.

3. You Plan for Rapid Growth

  • You anticipate increasing traffic, user engagement, or data volume.
  • Your MVP needs a scalable architecture to handle more users efficiently.

4. Security and Compliance Matter

  • Sensitive user data, payment systems, or regulatory requirements are involved.
  • Freelancers may lack the expertise to ensure security best practices.

How to Transition Smoothly to Full-Time Engineers

Once you’ve decided to hire real engineers, plan the transition carefully to avoid disruption:

  1. Audit Existing Code: Identify areas of technical debt and create a roadmap for refactoring.
  2. Hire Strategically: Look for engineers with startup experience who can handle rapid iteration and product scaling.
  3. Document Everything: Ensure all features, APIs, and infrastructure are well-documented for the new team.
  4. Maintain Continuity: Keep a few top freelancers for short-term tasks during the handover period.
  5. Invest in Tools: Use code repositories, CI/CD pipelines, and testing frameworks to support professional development practices.

Cost Considerations

Hiring full-time engineers is an investment. While freelancers may seem cheaper upfront, consider the long-term costs:

  • Technical Debt: Fixing poor-quality code can cost far more than hiring engineers initially.
  • Lost Customers: Product instability can lead to churn and missed revenue.
  • Opportunity Cost: Delays in scaling and adding features can let competitors win market share.

Think of full-time engineers as insurance for your product’s future success.


Conclusion

Freelancers are invaluable for testing your idea and building a lean MVP quickly. But relying on low-cost vibe coding can be dangerous: messy code, delayed timelines, and hidden costs can stall your startup before it even takes off. Once your product gains traction, complexity, and paying users, hiring real engineers ensures stability, scalability, and long-term growth.

Key Takeaway: Use freelancers for prototyping, but transition to full-time engineers before your MVP becomes a product your customers depend on. Planning the move carefully saves time, money, and frustration.


Have you experienced the vibe code tax firsthand? Share your story in the comments and tell us how you decided when to hire full-time engineers.

On AI-Generated Code, Maintainability, and the Possibility of Disposable Software

Over the past two years, I’ve been using various AI-assisted tools for programming like Codeium, GitHub Copilot, ChatGPT, and others. These tools have become part of my daily workflow. Mostly, I use them for code completion and to help me finish thoughts, suggest alternatives, or fill in repetitive boilerplate. I’m not doing anything too wild with autonomous agents or fully automated codebases. Just practical, incremental help.

That said, even in this limited use, I’m starting to feel the friction.

Not because the tools are bad but actually, they’re improving fast. Individual lines and even complete methods are cleaner than they used to be. The suggestions are smarter. The models are more context-aware. But one thing still nags at me: even with better completions, a lot of the output still isn’t good code in the long-term sense.


Maintainability Still Matters

The issue, to me, isn’t whether AI can help me write code faster. It can. The issue is whether that code is going to survive over time. Is it going to be easy to understand, extend, or refactor? Does it follow a style or pattern that another human could step into and build on?

This matters especially when you’re not the only one touching the code or when you come back to it after a few months and wonder, “Why did I do it this way?”

And here’s the contradiction I keep running into: AI helps you write code faster, but it often creates more problems to maintain. That’s especially true when I’ve tested more advanced setups where you let an agent plan and generate entire components, classes, or services. It sounds great in theory, but in practice it causes a lot of changes, inconsistencies, and small bugs that end up being more trouble to fix than if I had just written it myself from the start.

So for now, I stay close to completions. Code at the scale of a line or a method. It’s easier to understand, easier to control. I can be the architect, and the AI can be the assistant.


The Self-Fulfilling Trap

There’s a strange loop forming in AI development. Since the generated code is harder to reason about or maintain, people often treat it as throwaway. And because it’s throwaway, nobody bothers to make it better. So it stays bad.

Self-fulfilling prophecy.

The more AI you use to generate logic, the more you’re tempted to not go back and polish or structure it. You get into a loop of “just generate something that works,” and soon you’re sitting on a pile of glue code and hacks that’s impossible to build on.

But maybe that’s okay? Maybe we need to accept that some code isn’t meant to last.


Disposable Software Might Be the Point

This is where I’m starting to shift my thinking a little. I’ve always approached code as something you build on something that lives and evolves. But not all code needs that.

A lot of software today already is disposable, even if we don’t admit it. One-off internal dashboards, ETL jobs, scripts for events, MVPs for marketing campaigns, integrations that won’t live beyond a quarter. We often pretend we’re building maintainable systems, but we’re not. We just don’t call them disposable.

With AI in the mix, maybe it’s time to embrace disposability for what it is. Write the code, run the code, get the result, throw it away. Next time, generate it again maybe with better context or updated specs.

This mindset removes a lot of the pressure around maintainability. And it fits the strengths of today’s AI tools.


When Not to Use Agentic Systems (Yet)

I’ve played with more autonomous agent systems what people call “agentic AI” or multi-agent code platforms. Honestly? I’m not sold on them yet. They generate too much. They make decisions I wouldn’t make. They refactor things that didn’t need to be touched.

And then I spend more time reading diff views and undoing changes than I saved by delegating in the first place.

Maybe in the future I’ll be comfortable letting an AI agent draft a service or plan out an architectural pattern. But today, I’m not there. I use these tools more like smart autocomplete than autonomous developers. It’s still very much my code and they’re just helping speed up the flow.


Final Thoughts

There’s a real risk of overhyping what AI can do for codebases today. But there’s also an opportunity to rethink how we treat different classes of software. We don’t need to hold everything to the same standards of longevity. Not every project needs to be built for 10 years of feature creep.

Some software can (and should) be treated like scaffolding and built quickly, used once, and removed without guilt.

And that’s where AI shines right now. Helping us build the things we don’t need to keep.

I’ll keep experimenting. I’ll keep writing most of my own code, and using AI where it makes sense. But I’m also watching carefully because the balance between what’s worth maintaining and what’s better thrown away is shifting.

And we should all be ready for what that means.

The AI isn’t going to be on call at 2 AM when things go down.

Large Language Models (LLMs) like ChatGPT, Copilot, and others are becoming a regular part of software development. Many developers use them to write boilerplate code, help with unfamiliar syntax, or even generate whole modules. On the surface, it feels like a productivity boost. The work goes faster, the PRs are opened sooner, and there’s even time left for lunch.

But there’s something underneath this speed, something we’re not talking about enough. The real issue with LLM-generated code is not that it helps us ship more code, faster. The real issue is liability.


Code That Nobody Owns

There’s a strange effect happening in teams using AI to generate code: nobody feels responsible for it.

It’s like a piece of code just appeared in your codebase. Sure, someone clicked “accept,” but no one really thought through the consequences. This is not new, we saw the same thing with frameworks and compilers that generated code automatically. If no human wrote it, then no human cares deeply about maintaining or debugging it later.

LLMs are like that, but on a massive scale.


The “Average” Problem

LLMs are trained on a massive corpus of public code. What they produce is a kind of rolling average of everything they’ve seen. That means the code they generate isn’t written with care or with deep understanding of your system. It’s not great code. It’s average code.

And as more and more people use LLMs to write code, and that code becomes part of new training data, the model quality might even degrade over time, it becomes an average of an average.

This is not just about style or design patterns. It affects how you:

  • Deliver software
  • Observe and monitor systems
  • Debug real-world issues
  • Write secure applications
  • Handle private user data responsibly

LLMs don’t truly understand these things. They don’t know what matters in your architecture, how your team works, or what your specific constraints are. They just parrot what’s most statistically likely to come next in the code.


A Fast Start, Then a Wall

So yes, LLMs speed up the easiest part of software engineering: writing code.

But the hard parts remain:

  • Understanding the domain
  • Designing for change
  • Testing edge cases
  • Debugging production issues
  • Keeping systems secure and maintainable over time

These are the parts that hurt when the codebase grows and evolves. These are the parts where “fast” turns into fragile.


Example: Generated Code Without Accountability

Imagine you ask an LLM to generate a payment service. It might give you something that looks right, maybe even works with your Stripe keys or some basic error handling.

But:

  • What happens with race conditions?
  • What if fraud detection fails silently?
  • What if a user gets double-charged?
  • Who is logging what?
  • Is the payment idempotent?
  • Is sensitive data like credit cards being exposed in logs?

If no one really “owned” that code because it was mostly written by an AI and these questions might only surface after things go wrong. And in production, that can be very costly.


So What’s the Better Approach?

LLMs can be great tools, especially for experienced engineers who treat them like assistants, not authors.

To use LLMs responsibly in your team:

  • Review AI-generated code with care.
  • Assign clear ownership, even for generated components.
  • Add context-specific tests and documentation.
  • Educate your team on the why, not just the how.
  • Make accountability a core part of your development process.

Because in the end, you are shipping the product. The AI isn’t going to be on call at 2 AM when things go down.


Final Thoughts

LLMs give us speed. But they don’t give us understanding, judgment, or ownership. If you treat them as shortcuts to ship more code, you may end up paying the price later. But if you treat them as a tool and keep responsibility where it belongs they can still be part of a healthy, sustainable development process.

Thanks for reading. If you’ve seen this problem in your team or company, I’d love to hear how you’re dealing with it.

AI Isn’t Leveling the Playing Field, it’s Amplifying the Gap

We were told that AI would make development more accessible. That it would “level the playing field,” empower juniors, and help more people build great software.

That’s not what I’m seeing.

In reality, AI is widening the gap between junior and senior developers and fast.


Seniors Are 10x-ing With AI

For experienced engineers, AI tools like ChatGPT and GitHub Copilot are a multiplier.

Why?

Because they know:

  • What to ask
  • How to evaluate the answers
  • What matters in their system
  • How to refactor and harden code
  • When to ignore the suggestion completely

Seniors are using AI the same way a great chef uses a knife: faster, safer, more precise.


Juniors Are Being Left Behind

Many junior developers, especially those early in their careers, don’t yet have the experience to judge what’s good, bad, or dangerous. And here’s the issue:

AI makes it look like they’re productive until it’s time to debug, optimize, or maintain the code.

They’re often:

  • Copy-pasting solutions without understanding the trade-offs
  • Relying on AI to write tests they wouldn’t know how to write themselves
  • Shipping code that works on the surface, but is fragile underneath

What they’re building is a slow-burning fire of tech debt, and they don’t even see the smoke.


Prompting Isn’t Engineering

There’s a new kind of developer emerging: one who can write a great prompt but can’t explain a stack trace.

That might sound harsh, but I’ve seen it first-hand. Without a foundation in problem-solving, architecture, debugging, and security prompting becomes a crutch, not a tool.

Good engineering still requires:

  • Judgment
  • Pattern recognition
  • Systems thinking
  • Curiosity
  • Accountability

AI doesn’t teach these. Mentorship does.


Where Is the Mentorship?

In many teams, mentorship is already stretched thin. Now we’re adding AI to the mix, and some companies expect juniors to “just figure it out with ChatGPT.”

That’s not how this works.

The result? Juniors are missing the critical lessons that turn coding into engineering:

  • Why things are built the way they are
  • What trade-offs exist and why they matter
  • How to debug a system under load
  • When to break patterns
  • How to think clearly under pressure

No AI can give you that. You only get it from real experience and real guidance.


What We Can Do

If you’re a senior engineer, now is the time to lean into mentorship not pull away.

Yes, AI helps you move faster. But if your team is growing and you’re not helping juniors grow too, you’re building speed on a weak foundation.

If you’re a junior, use AI but don’t trust it blindly. Try to understand everything it gives you. Ask why. Break it. Fix it. Learn.

Because here’s the truth:

AI won’t make you a better engineer. But it will make great engineers even better.

Don’t get left behind.


Final Thoughts

AI isn’t the enemy. But it’s not a shortcut to seniority either. We need to be honest about what it’s good for and where it’s failing us.

Let’s stop pretending it’s a magic equalizer. It’s not.

It’s a magnifier.
If you’re already strong, it makes you stronger.
If you’re still learning, it can hide your weaknesses until they blow up.

Homebrew: How to start and stop background services

Anyone that has installed application running in the background from Homebrew, knows how to use launchctl that actually runs every application when the computer restarts. It is pretty straight forward task but most of the time you need to know the location of the .plist file that defines how to run it installed with homebrew.

Now there is a quicker path how to control them by simply adding following package to home-brew:

brew tap gapple/services
 And you have available to start, stop services directly from home-brew with following command to get a list of active services:
brew services list
So for example if you have installed postgresql you can start it as a background service with:
brew services start postgresql
or stop the service with
brew services stop postgresql

Which is much more easier and simpler than finding the right .plist file inside cellar folder of brew

AngularJS ngInclude directive and scope inheritance

ngInclude directive and scope

There are many times when you want to include a html snippet code from another file but preserve the scope of it. It is usually when you have different form fields for the various objects and you want to have a global controller that oversees the updating of different forms. So if you want to take the quickest route and use ngInclude directive you would be surprised that it is not properly linking to your controller and you cannot access the form instance.

This is due to ngInclude internals and how they work. ngInclude creates for each use as a new child scope so overwriting anything inside the new included HTML file content will be written into child scope and not in the one you’ve anticipated to be. So there are few workaround around this as creating a new object inside the scope for example

$scope.data = {}

inside the controlling controller and then in the imported html file set values inside the

<input type="text" ng-model="data.name"/>

This works if you don’t have a problem with static value being inserted into all html files, but if you want maximum flexibility then this is not the perfect solution. So after inspecting the source code inside ngInclude.js, I have seen a room for improvement and created a similar directive to ngInclude called ngInsert, which instead of making new child scope it inherits the current scope and continue using it inside. You can pick up the whole source code at this gist. You can use it in the same manner as existing ngInclude. Continue reading “AngularJS ngInclude directive and scope inheritance”

How to record iPhone screen

To record iPhone screen has never been easier

Developing great new iOS application requires not just a usable application, but also a great video presentation of it. How it works, basic usability tricks to make users want to get your new application which you spent numerous hours to make it perfect.

If you are working alone on next big thing or inside a small agency or team and you probably have a limited budget to outsource your video production one of the hardest parts was shooting the actual content from iOS device, whether it is iPhone or iPad. Until now you could use some kind of recording of iOS simulator or using airplay method to sync the video. It worked but it was somehow clunky experience and you needed to buy extra software.

With the release of Mac OS Yosemite version everything has changed. Now you can record you iOS device screen directly without buying additional software whatsoever. All you need to have the computer upgraded to Yosemite version and an iPhone or iPad to latest iOS 8. iOS device needs to connect to your computer through lighting cable.

Continue reading “How to record iPhone screen”

AngularJS and Ruby on Rails work together

Finding the best integration of AngularJS and Ruby on Rails

Recently I got really excited with AngularJS so to make it work perfectly with Ruby on Rails there are some configurations needed. There are available blog posts on how to integrate it perfectly but somehow I wasn’t happy with the available preferences. Some offered to add the javascript files manually to the project and to manual project organization, others offered some kind of gem packager or even automated as a rails app template.

My goal is to describe how to start new rails app project from the scratch but the instructions should be succinct enough to be able to reuse them for the existing project (Actually I did extract it from the existing application I am working on). For the front end development I recently discovered great gem that really can make it more closer to pure full stack javascript development.
Bower is a great javascript package manager by the people who are working on Twitter Boostrap. It is like Bundler but made for javascript instead of ruby language. When I found out that there is a ruby gem that is integrated with rake tasks so I can easily update all javascript libraries without needing adding gem library for each one. The gem is called bower-rails.

My initial plan is to evolve this post into a series of blog posts on how to develop a fully functional demo application so I’ve included some steps that are might not needed but are good to have. Don’t worry I will provide explanation why I am using each of them.
Here is my plan what I will try to achieve with this series of posts:

  • creating a new demo project with angularJS from scratch, showing all my changes along the way, and trying to explain every step. this will include creating basic rails 4 app
  • adding basic gems
  • setup front end development with Bower
  • adding angularJS
  • implementing basic Rails and AngularJS controllers

Continue reading “AngularJS and Ruby on Rails work together”