Skip to content

Iain Broome

I'm the author of the novel, A is for Angelica. Every week, I send Draft Mode, a newsletter full of tips and tools that help you improve your craft and promote your writing.

Blogging

The problem with link posts

Redesigning your website provides an opportunity to take stock and think about what you’re doing. You get to look at what works well and what doesn’t, and assess whether your approach [https://www.iainbroome.com/blog/thinking-about-blogging] is still appropriate. As you know, I’ve just done all

A is for Angelica

Welcome to my new website

Welcome to iainbroome.com, previously Write for Your Life. If you read regularly or listen to the podcast [https://www.iainbroome.com/podcast] (which is keeping the Write for Your Life name), then you’ll know I’ve been planning to change things around here for a little while. With

Draft Mode

01: Double dose of news

The first dispatch from The Broome Cupboard and it contains two pieces of exciting news. Well, three actually!

A is for Angelica

Buy A is for Angelica, my debut novel

I had to take a quick break from my short blogging hiatus to tell you that A is for Angelica is now available to pre-order from Amazon in the UK [http://www.amazon.co.uk/A-Angelica-Iain-Broome/dp/190877598X/ref=sr_1_1?ie=UTF8&qid=1338242633&sr=8-1]

A is for Angelica

An update on what the heck is going on

You may have noticed that I’ve not been updating the site as much recently, and that things have generally gone a bit quiet since I announced my book deal for A is for Angelica [http://writeforyourlife.net/special-announcement]. It’s partly because I’ve been working hard on editing

You do other things when you're not on the internet

So I’ve been working on my novel [http://writeforyourlife.net/special-announcement] over the last month or so, which has meant that I’ve had less time for blogging, tweeting [http://twitter.com/iainbroome] and other internet-based affairs. The first few days I felt an acute sense of hey, who

Book marketing for beginners: say something

I was at the opticians the other day (I’ve been trying to get contact lenses sorted, but my stupid eyes don’t seem to be compatible. It’s extremely annoying. Are they supposed to be a bit itchy? A bit uncomfortable? Answers in the comments are welcome.) when something

Why writers need to be ready for and willing to change

As I’m busy working on edits to my novel, I thought I’d record a quick video about the idea of change when it comes to writing. We all like to plan for things and it’s certainly sensible to have a good idea of what you’re doing

What are you trying to achieve with your novel?

Since my announcement last week [http://writeforyourlife.net/special-announcement], I’ve been going through old drafts of A is for Angelica and making final edits on the novel before publication. It’s made for fascinating reading. For example, I wrote the following commentary as part of my final submission for

A very special announcement

I’ve been wanting to say this for quite some time: A is for Angelica, my first novel, will be published on 1 September 2012 [http://www.thebookseller.com/news/legend-press-acquires-stylish-debut.html]. Yes, it’s true. Last week, I signed a contract with Legend Press [http://www.legendpress.co.uk/

/** * Micro.blog integration for Ghost using App Token (recommended approach) * To use this script: * 1. Go to your Ghost Admin Panel * 2. Navigate to Settings → Code Injection * 3. Paste this code in the "Site Footer" section * 4. Replace the placeholders with your actual values */ (function() { // Configuration const config = { microblogUsername: 'iainbroome', // Your micro.blog username appToken: '5FCF352BBF139DA801F8', // Your micro.blog app token (if using authenticated API) postsPerPage: 10, targetElement: '#microblog-posts' // The element where posts will be displayed }; // Only run on the micro.blog page if (!document.querySelector(config.targetElement)) { return; } // Styles const styles = ` .mb-container { margin: 2rem 0; } .mb-post { margin-bottom: 2rem; padding-bottom: 1.5rem; border-bottom: 1px solid var(--ghost-accent-color, #eee); } .mb-post:last-child { border-bottom: none; } .mb-date { font-size: 0.9rem; color: var(--ghost-secondary-color, #666); margin-bottom: 0.5rem; } .mb-content { margin-bottom: 0.5rem; } .mb-content img { max-width: 100%; border-radius: 4px; margin: 0.5rem 0; } .mb-link { font-size: 0.9rem; } .mb-link a { color: var(--ghost-accent-color, #1a73e8); text-decoration: none; } .mb-link a:hover { text-decoration: underline; } .mb-pagination { display: flex; justify-content: space-between; margin-top: 2rem; } .mb-pagination button { background-color: var(--ghost-accent-color, #1a73e8); color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; } .mb-pagination button:disabled { background-color: #ccc; cursor: not-allowed; } .mb-error { color: #d32f2f; padding: 15px; border: 1px solid #ffd7d7; background-color: #fff8f8; border-radius: 4px; } .mb-loading { text-align: center; padding: 20px; color: var(--ghost-secondary-color, #666); } `; // Add styles to head const styleElement = document.createElement('style'); styleElement.textContent = styles; document.head.appendChild(styleElement); // State let currentPage = 1; // DOM elements const targetElement = document.querySelector(config.targetElement); if (!targetElement) return; // Create container elements const container = document.createElement('div'); container.className = 'mb-container'; const postsContainer = document.createElement('div'); postsContainer.className = 'mb-posts'; const paginationContainer = document.createElement('div'); paginationContainer.className = 'mb-pagination'; paginationContainer.innerHTML = ` `; container.appendChild(postsContainer); container.appendChild(paginationContainer); targetElement.appendChild(container); const prevButton = paginationContainer.querySelector('.mb-prev'); const nextButton = paginationContainer.querySelector('.mb-next'); // Fetch posts function fetchPosts(page = 1) { postsContainer.innerHTML = '
Loading micro.blog posts...
'; let endpoint, headers = {}; if (config.appToken) { // Authenticated API (preferred) endpoint = `https://micro.blog/posts?count=${config.postsPerPage}&page=${page}`; headers = { 'Authorization': `Bearer ${config.appToken}` }; } else { // Public JSON feed (limited) endpoint = `https://micro.blog/posts/${config.microblogUsername}`; } fetch(endpoint, { headers }) .then(response => { if (!response.ok) { throw new Error(`Failed to fetch posts (${response.status})`); } return response.json(); }) .then(data => { displayPosts(data.items || []); updatePagination((data.items || []).length < config.postsPerPage); }) .catch(error => { postsContainer.innerHTML = `

Error loading micro.blog posts: ${error.message}

Note: For best results, obtain an app token from micro.blog.

`; }); } // Display posts function displayPosts(posts) { if (!posts || posts.length === 0) { postsContainer.innerHTML = '

No micro.blog posts found.

'; return; } postsContainer.innerHTML = ''; posts.forEach(post => { const postDate = new Date(post.date_published); const postElement = document.createElement('div'); postElement.className = 'mb-post'; let postHTML = `
${formatDate(postDate)}
${post.content_html}
`; if (post.url) { postHTML += ` `; } postElement.innerHTML = postHTML; postsContainer.appendChild(postElement); }); } // Update pagination buttons function updatePagination(isLastPage) { prevButton.disabled = currentPage === 1; nextButton.disabled = isLastPage; } // Format date function formatDate(date) { const options = { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' }; return date.toLocaleDateString(undefined, options); } // Event listeners for pagination prevButton.addEventListener('click', function() { if (currentPage > 1) { currentPage--; fetchPosts(currentPage); scrollToTop(); } }); nextButton.addEventListener('click', function() { currentPage++; fetchPosts(currentPage); scrollToTop(); }); // Scroll to top of posts container function scrollToTop() { container.scrollIntoView({ behavior: 'smooth' }); } // Initial fetch fetchPosts(); })();